2014-02-21 4 views
1

У меня есть ситуация, когда у меня есть базовый класс Base, из этого класса я получаю DerivedA и DerivedB. Давайте предположим, что c'tor для базы выглядит следующим образом:Инициализация базового класса с параметрами, сгенерированными производными [C++]

Base(int a) : m_a(a) {} 

теперь проблема в том, что класс DerivedA и DerivedB каждый использовать некоторый алгоритм для определения сказал «а», тем самым DerivedA() : Base(a) невозможно, как это генерируется в теле конструкторов.

Какие существуют решения для такой проблемы?

+0

@Angew я только заметил, что, то у меня нет решения этой –

ответ

4

Половина строительства объекта всегда плохая идея. либо вы не строите его, либо полностью его создаете.

В вас случае наилучшим решением является использование функции свободного

int complexCalculation(int a){...} 
DerivedA():Base(complexCalculation(a)) 
{ 

} 

Или вы можете использовать частный (или Protected) статическая функция

struct DerivedA{ 
DerivedA():Base(complexCalculation(a)) 
{ 

} 
private: 
static int complexCalculation(int a){...} 
}; 
+0

Почему не частные (или защищенных) статических функции? –

+0

Потому что я предположил, что вычисление могло быть общим. Но частная (или защищенная) статическая функция также была бы хорошей – Davidbrcz

0

Вы можете создать частный статический функции для инициализации a

class DerivedA : public Base{ 
public: 
    DerivedA() : Base(compute_a()) 
    { 
    } 
private: 
    static int compute_a() { 
    //... 
    } 
}; 

Если возможно, вы можете также конвертировать Base в шаблон и использовать Curiously recurring template pattern.

template<typename Sub> 
struct Base { 
    int a; 
    Base() : a(Sub::compute_a()) {} 
}; 

struct DerivedA : Base <DerivedA> { 
    static int compute_a() { 
    //... 
    } 
} 
Смежные вопросы