Child的构造函数不识别基类'成员:mean,sigma“不是非静态数据成员或基类”

时间:2016-01-23 14:40:31

标签: c++ inheritance constructor initialization virtual

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

2 个答案:

答案 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);
 }