子构造函数无法识别基类的成员:平均值,西格玛"is not a nonstatic data member or base class"



子类"RandomUniform"中的构造函数旨在重新初始化母类"RandomVar"的成员"mean"和"sigma",如果创建的对象变得均匀。但我得到错误:意思是,西格玛"不是非静态数据成员或基类"。据我了解,在基类中声明的所有成员都必须在子级中重新声明和重建(重新初始化)为静态成员(与变量"uplimit"和"downlimit"没有区别),这是继承的最大想法。那么问题出在哪里呢?

这是我找到的最佳答案: c ++ 子类 无法初始化基类的成员变量?但是"这是因为基类(以及扩展,其所有数据成员)在派生类及其任何成员之前初始化"这句话对我来说并不清楚。即使以前做过,构造函数也不是用来重新初始化变量的吗?

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(){
}

只能初始化对象一次。之后,您只能分配它们:

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) 
{}

父对象的构造函数在 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);
 }

最新更新