使用派生[C ++]生成的参数初始化基类

时间:2014-02-21 12:29:07

标签: c++ inheritance

我有一种情况,我有一些基类Base,从这个类我派生DerivedA和DerivedB。让我们假设Base的c'tor看起来像这样:

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

现在的问题是,类DerivedA和DerivedB都使用一些算法来确定所说的“a”,所以做DerivedA() : Base(a)是不可能的,因为a正在构造函数体中生成。

有什么解决方案可以解决这个问题?

2 个答案:

答案 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() {
    //...
  }
}