子类“RandomUniform”中的构造函数旨在如果创建的对象变得均匀,则重新初始化Mother类“RandomVar”的成员“mean”和“sigma”。但是我得到了错误:mean,sigma“不是非静态数据成员或基类”。据我了解,所有在基类中构造的成员都必须在子代中重新声明和重构(重新初始化)为静态成员(与变量“uplimit”和“downlimit”没有区别)并且它是继承的最佳概念。那么问题是什么?
以下是我找到的最佳答案:c++ Child class Unable to initialize Base class's member variable? 但是句子“这是因为基类(以及扩展名,它的所有数据成员)在派生类之前被初始化,而它的任何成员”对我来说都不清楚。构造函数是否可以重新初始化变量,即使之前已完成?
PS:我使用符号RandomVar :: RandomVar()作为下面的代码,以准确显示如何在cpp文件中编写方法。
class RandomVar{
public:
double mean;
double sigma;
RandomVar();
virtual ~RandomVar();
};
RandomVar::RandomVar() : mean(0), sigma(1) {
}
RandomVar :: ~RandomVar(){
}
class RandUniform: public RandomVar {
protected:
double downlimit;
double uplimit;
public:
RandUniform();
virtual ~RandUniform();
};
RandUniform::RandUniform() : downlimit(0), uplimit(1), mean(0.5), sigma (sqrt(1/12)) {
}
RandUniform :: ~RandUniform(){
}
答案 0 :(得分:2)
您只能初始化一次对象。之后你只能分配它们:
RandUniform::RandUniform() : downlimit(0), uplimit(1)
{
mean = 0.5;
sigma = sqrt(1./12);
}
或者,您可以将基类变量的初始化委托给基类构造函数:
//Make it protected if you do not want end user to see it.
RandomVar::RandomVar(double m, double s) : mean(m), sigma(s)
{}
RandUniform::RandUniform() : RandomVar(0.5, sqrt(1./12)), downlimit(0), uplimit(1)
{}
答案 1 :(得分:-1)
在RandUniform构造函数之前调用父对象的构造函数。这就是为什么编译器很困惑,你正在设置的成员已经被声明(基本上就像写int i; int i;
)。当您的父类具有复杂的初始化方法时,这非常舒适。
为什么我不知道它是否被认为是最佳实践。但我通常让我的父对象支持受保护的Set方法。所以我能做到:
RandUniform::RandUniform() : downlimit(0), uplimit(1){
this->Set(0.5,sqrt(1/12));
}
或者你也可以手动完成:
RandUniform::RandUniform() : downlimit(0), uplimit(1){
mean = 0.5;
sigma = sqrt(1/12);
}