我目前正在尝试提供多个头文件的实现。我试着这样做:
// 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();
}
这个想法是,提供多个 A 类的实现,可以通过简单地更改 define 的值来切换IMPL
。问题是,实际使用的实现B
中的方法永远不会被调用。A
而是调用基类中的方法。我试图从构建中完全删除 A.cpp,因为它从未使用过,或者说永远不应该使用,但是它不会构建,告诉我,我的测试代码中有未定义的引用。