Два дочерних класса, которые отличаются только статическим константным членом

У меня есть класс 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

Решение

Вы можете написать конструктор для 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)
{}
};

Единственная проблема заключается в том, что конструктор базового класса вызывается первым, поэтому вам нужно повторить постоянное значение данных дважды. Вы можете легко макрос это, хотя.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector