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

Posted

技术标签:

【中文标题】使用派生 [C++] 生成的参数初始化基类【英文标题】:Initializing base class with parameters generated by derived [C++] 【发布时间】:2014-02-21 12:29:06 【问题描述】:

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

Base(int a) : m_a(a) 

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

此类问题有什么解决方案?

【问题讨论】:

@Angew 我刚刚注意到,然后我没有解决方案 【参考方案1】:

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

在您的情况下,最好的解决方案是使用免费功能

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



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

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



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

【讨论】:

为什么不是私有(或受保护)静态函数? 因为我假设计算可以共享。但是私有(或受保护)静态函数也很好【参考方案2】:

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

【讨论】:

以上是关于使用派生 [C++] 生成的参数初始化基类的主要内容,如果未能解决你的问题,请参考以下文章

生成一个派生类对象时,调用基类和派生类构造函数按啥次序

C++学习之路派生类的构造函数

关于C++基类与派生类

C++ - 在派生类中静态初始化基类受保护的成员变量

C++基类和派生类的构造函数

初始化基类成员的首选方法 (c++)