0

私はC++プログラムA.cppを持っていて、2つのヘッダーファイルXhとYhをインクルードしています。このプログラム(A.cpp)には、クラス'foo'とそのクラスのすべてのメンバーのプロトタイプがあります。このクラスの実装はXhとYhで行われます。どちらにもメンバー関数の異なる定義が含まれています。ただし、これらのファイルの1つを含めるには、プログラムで#ifdefを使用して条件付きで行います。したがって、特定の条件が満たされている場合、Xhは#include-edであり、そうでない場合、Yhは#include-edです。それらの両方が一緒に含まれることはありません。問題は次のとおりです。このコンパイル時のトグルを実行時のトグルに変更する必要があります。実行時にヘッダーファイルをインクルードできないことを知っているので、名前空間を使用せずに、必要な実装を「選択」できる方法はありますか?関数のプロトタイプは同じであるため、オーバーロードは除外されます。

どうもありがとう。(これがばかげている場合は申し訳ありません。私はC ++の初心者です)

4

2 に答える 2

3

実行時に2つの異なる動作が必要な場合は、ポリモーフィズムを記述しているように聞こえます。仮想関数を持つ共通の基本クラスから継承する2つの異なるクラスを作成することを検討してください。次に、実行時に次のようなことを行うことができます。

Animal &a = (x == 3) ? Dog() : Cat();

a.talk();
于 2013-01-14T01:46:44.223 に答える
0

おそらく、静的ファクトリメソッドパターンを検討したいですか?選択したインスタンスを呼び出し元に返す単一のメソッドを持つことができます。OliCharlesworthが提案するようにサブクラス化する必要があります。そうすると、呼び出し元のコードに対して透過的になります。

擬似コードで。

class baseclass{
...
static baseclass *GimmeImpl(){
    if(aImpl){
       return A();
    }else{
       return B();
    }

}

};

class A:public baseclass {...};
class B:public baseclass {...};
于 2013-01-14T01:47:42.210 に答える