現在、ヘッダー ファイルの複数の実装を提供しようとしています。私はこれを次のようにしてみました:
// A.h:
class A {
public:
A();
~A();
bool method1();
bool method2();
}
// A.cpp:
A::A() {
}
A::~A() {
}
bool A::method1() {
}
bool A::method2() {
}
// B.h
class B : public A {
public B();
public ~B();
bool method1();
bool method2();
}
// B.cpp
B::B() {
}
B::~B() {
}
bool B::method1() {
// actual code I want to use
}
bool B::method2() {
// actual code I want to use
}
// AFactory.h
#define USE_B 10
#define USE_C 20
#define IMPL USE_B
class A;
class AFactory {
public:
static A *getImplementation();
}
// AFactory.cpp
A *AFactory::getImplementation() {
#if IMPL == USE_B
return new B();
#elif IMPL == USE_C
return new C();
#else
return NULL;
#endif
}
// Test.cpp
int main () {
A *test = AFactory::getImplementation();
test->method1();
test->method2();
}
define の値を変更するだけで切り替えることができる、クラス A の複数の実装を提供するというアイデアでしたIMPL
。問題は、実際に使用されている実装のメソッドB
が呼び出されないことです。代わりに、基本クラスのメソッドA
が呼び出されます。A.cpp は決して使用されないか、使用されるべきではないため、ビルドから完全に削除しようとしましたが、ビルドされず、テスト コードに未定義の参照があることがわかりました。