我有一种情况,我有一些基类Base,从这个类我派生DerivedA和DerivedB。让我们假设Base的c'tor看起来像这样:
Base(int a) : m_a(a) {}
现在的问题是,类DerivedA和DerivedB都使用一些算法来确定所说的“a”,所以做DerivedA() : Base(a)
是不可能的,因为a正在构造函数体中生成。
有什么解决方案可以解决这个问题?
答案 0 :(得分:4)
构建对象的一半总是一个坏主意。或者要么你没有完全构建它。
在你的情况下,最好的解决方案是使用免费功能
int complexCalculation(int a){...}
DerivedA():Base(complexCalculation(a))
{
}
或者您可以选择使用私有(或受保护的)静态功能
struct DerivedA{
DerivedA():Base(complexCalculation(a))
{
}
private:
static int complexCalculation(int a){...}
};
答案 1 :(得分: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() {
//...
}
}