我有一个班级A
和两个孩子B
和C
如下:
class A {
private:
int x;
template<class T>
void setX(T &y);
public:
A();
};
class B : public A {
private:
static const double y;
public:
B();
};
class C : public A {
private:
static const int y;
public:
C();
};
两个孩子的静态成员y
的类型不同。除静态成员的初始化外,C和B的实现是相同的:
B::B() : y (1.2) { setX(y) }
C::C() : y (2) { setX(y) }
但这种方法的问题在于,在实现文件中,我必须为B
和C
编写两次相同的代码。有没有一种正确的方法来写这个,这样我就不需要写两次setX
的调用了?
在真正的问题中,课程有点复杂,但手头的情况是一样的。特别是,y
的初始化需要非平凡的构造函数,因此必须在实现文件中。
答案 0 :(得分:1)
您可以为A
编写一个构造函数作为函数模板。
class A {
//....
public:
template<typename T>
explicit A(T& y) {
setX(y);
}
};
从子类中调用该构造函数:
class B : public A{
//...
public:
B() : A(1.2), y(1.2)
{}
};
唯一的问题是首先调用基类构造函数,因此需要重复两次常量数据值。你可以轻松地将其设为宏。