繁体   English   中英

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

[英]Initializing base class with parameters generated by derived [C++]

我遇到一个基类Base的情况,从该类派生DerivedA和DerivedB。 假设Base的c'tor看起来像这样:

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

现在的问题是,类DerivedA和DerivedB都使用某种算法来确定“ a”,因此DerivedA() : Base(a)进行DerivedA() : Base(a) ,因为在构造函数主体中正在生成a。

对于这种问题有什么解决方案?

一半构造一个对象总是一个坏主意。 您要么不构建它,要么就完全构建它。

您的最佳解决方案是使用自由功能

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

}

或者,您可以选择使用私有(或受保护)静态函数

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

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

您可以创建一个私有的静态函数来初始化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() {
    //...
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM