仮想継承と多重継承に関する以前の質問(クロスプラットフォームシナリオ)に続くために-いくつかの回答を読んだ後、サーバークラスとクライアントクラスを保持し、プラットフォーム固有のクラスを次のように置き換えることでモデルを単純化できることに気付きました#ifdefs(これは私が最初にやろうとしていたことです)。
このコードを使用する方が簡単ですか?少なくともファイルが少なくなることを意味します!欠点は、いたるところにFoobar
あるため、クラスがやや「醜く」、少し読みづらくなることです。#ifdefs
Unix Foobarのソースコードがコンパイラに渡されることはないため、これはと同じ効果があることに注意してください(呼び出すプラットフォーム固有のクラスを決定するために#ifdef
も使用するため)。#ifdef
class Foobar {
public:
int someData;
#if WINDOWS
void someWinFunc1();
void someWinFunc2();
#elif UNIX
void someUnixFunc1();
void someUnixFunc2();
#endif
void crossPlatformFunc();
};
class FoobarClient : public Foobar;
class FoobarServer : public Foobar;
注:簡単な例として、いくつかのもの(ctorなど)は省略されています。
アップデート:
この問題の背景をもっと読みたい人のために、私は本当に適切なメーリングリストのスレッドをざっと読むことをお勧めします。3番目の投稿のあたりで物事が面白くなり始めます。また、関連するコードコミットがあり、ここで問題の実際のコードを確認できます。