【问题标题】:Child's constructor doesn't recognize base class' members: mean, sigma "is not a nonstatic data member or base class"Child的构造函数不识别基类的成员:意思是,sigma“不是非静态数据成员或基类”
【发布时间】:2016-04-30 02:53:57
【问题描述】:

子类“RandomUniform”中的构造函数旨在如果创建的对象变得统一,则重新初始化母类“RandomVar”的成员“mean”和“sigma”。但我得到错误:意思是,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(){
}

【问题讨论】:

    标签: c++ inheritance constructor initialization virtual


    【解决方案1】:

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

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

    【讨论】:

    • 它可以工作并且足够面向对象,谢谢!
    【解决方案2】:

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

    【讨论】:

    • 初始化设置器是邪恶的(你有一个构造函数 - 使用它!!)并且“手动执行”更糟糕。
    猜你喜欢
    • 2013-11-12
    • 1970-01-01
    • 2013-09-14
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多