我目前有一个用C ++定义的类,它包含一个C-preprocessor变量来打开/关闭某个特性:
A.hh
class A : public B {
//...
#ifdef PPVAR
int _i;
#endif
public:
A();
//...
};
A.cc
A::A()
#ifdef PPVAR
: B(1)
#else
: B(2)
#endif
{}
影响成员变量和超类的初始化。目前,我通过在我的c ++编译器标志中包含/排除“-DPPVAR”来切换案例。但是,将两个实现同时同时更加可取。
我原则上可以复制这些源文件(A_on。[hh,cc],A_off。[hh,cc])但是因为它们有很多共同点,所以这看起来非常不优雅。因为标志会影响超类的成员和构造函数,所以我看不到通过简单地引入全局变量bool switchFeature = [T|F]
和使用
if (switchFeature) {
//...
} else {
//...
}
everywwhere。如果这是可能的,那将是我的选择方法,我很乐意听到你的解决方案!
作为替代方案(尽管类的数量加倍)我想也许可以编译这个源两次,一次使用“-DPPVAR”,一次没有并生成两个目标文件A_on.o,A_off.o,但不知何故我会仍然需要复制我的标题才能使用,并且需要对其余代码进行更多修改。
我很感激有关如何解决这个问题的任何见解和暗示
答案 0 :(得分:1)
从A
制作您的课程int
模板。
template<int PPVAR_val = 1>
class A : public B {
//number of members can also differ for partial specializations
int _i;
public:
A();
//...
};
<强> A.cpp 强>
template<int PPVAR_val>
A::A()
: B(PPVAR_val)
{}
答案 1 :(得分:0)
如果A与其子级
之间的某些代码不同,您应该为A创建子级并添加虚拟方法A.hh
class A : public class B {
// Common attributes and Functions
...
protected:
A(int ppvar) : B(ppvar) {}; // Not public
public:
A() : B(1) {};
virtual method(); // Method that differ between A and its Child
...
};
class A2 : public class A {
// Attributes only needed by A2
...
public:
A2() : A(2) {};
method(); // Say that A2 will use its own implementation of method
};
main.cc
int main(void)
{
bool PPVar = ...;
A *a;
if (PPVar)
a = new A();
else
a = new A2();
a->method();
return (0);
}
抽象类A,有两个孩子AOn和Aoff。