[英]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.