У меня есть класс 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
требует нетривиальных конструкторов и поэтому должен быть в файле реализации.
Вы можете написать конструктор для 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)
{}
};
Единственная проблема заключается в том, что конструктор базового класса вызывается первым, поэтому вам нужно повторить постоянное значение данных дважды. Вы можете легко макрос это, хотя.
Других решений пока нет …