もちろん、私は最良の答えは「あなた自身のクロスプラットフォームコードを書かないで、誰かがあなたが必要としていることをしている」ということですが、私はこれを趣味/学習としてやっていますどんな給料をもらっていない。基本的には、C++で小さなコンソールアプリケーションを作成しています。ファイル、ソケット、スレッドなどを扱うクロスプラットフォームにしたいと考えています。 OOPはこれを処理する素晴らしい方法のように思えますが、クロスプラットフォームを共有する同じインターフェイスを共有するクラスを書くための良いパターンは実際には見つかりませんでした。C++でのクロスプラットフォームOOP
簡単なアプローチは、いくつかのメタインターフェイスを計画し、それをプログラムの残りの部分で使用し、プラットフォームに応じて異なるファイルで同じクラスをコンパイルするだけですが、それはよりエレガントです。少なくとも、IntelliSenseとそのilkを混乱させないものが良いでしょう。
あなたはその後、これをコンパイルすることができます例えば
class Foo
{
public:
Foo();
void Bar();
private:
FooData data;
};
、私はwxWidgetsのソース内の小さいクラスのいくつかを見て撮影した、と彼らはクラスのデータを保持するプライベートメンバを使用するアプローチを使用プラットフォームに応じて異なる実装ファイルを選択するだけです。このアプローチは、私にとってかなり厄介なようです。
私が考えてきたもう1つのアプローチは、インターフェイスを作成し、プラットフォームに応じてそのインターフェイスを継承するクラスを交換することです。このような何か:もちろん
class Foo
{
public:
virtual ~Foo() {};
virtual void Bar() = 0;
};
class Win32Foo
{
public:
Win32Foo();
~Win32Foo();
void Bar();
};
ネジアップあなたがオブジェクトを作成するために、どの実装を知らないが、それは機能
Foo* CreateFoo();
を使用することによって回避することができますので、実際のインスタンス化のこの種
を実行し、実行しているプラットフォームに基づいて関数の実装を変更します。私はこれも大いに賛成ではありません。なぜなら、まだインスタンス化メソッドの束でコードが浪費されているように思えます(これは、非クロスプラットフォームオブジェクトを作成する方法とも矛盾します)。
これらの2つのアプローチのどちらが優れていますか?より良い方法がありますか?
編集:明確にするために、私の質問は「クロスプラットフォームのC++をどうやって書くのですか?むしろ、C++でクラスを使用してクロスプラットフォームコードを抽象化する最良の方法はありますが、可能な限り型システムから多くの利益を得ていますか?
これはいい考えです。私はBoostが何をしているかを見ていきます。 私は不思議ですが、このパターンは実装間でクラスの状態を変えることができますか?たとえば、PosixとWin32のファイルハンドルは異なるタイプです。ファイルラッパーを作成していれば、状態構造体/クラスは異なる必要があります。 – ShZ
あなたは 'file_handle'クラスを作成し、通常は' void * 'にハンドルを埋め込みます。実装は、必要なものに戻すことができます。これは標準によって安全に保証されています。このメソッドは、ライブラリーからロードされた 'detail :: whatever'を' some_function_pointer'に置き換えるだけで、実装を動的にロードする場合にもうまくいきます。 – GManNickG
+1:常にビルドシステムに委譲する具体的なビルド時間はどれですか –