使用派生 [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++] 生成的参数初始化基类的主要内容,如果未能解决你的问题,请参考以下文章