Child 的构造函数无法识别基 class' 成员:mean、sigma "is not a nonstatic data member or base class"
Child's constructor doesn't recognize base class' members: mean, sigma "is not a nonstatic data member or base class"
child class "RandomUniform" 中的构造函数旨在重新初始化 Mother class "RandomVar" 的成员 "mean" 和 "sigma" 如果对象创建变得均匀。但是我得到了错误:mean, sigma "is not a nonstatic data member or base class"。据我了解,所有在 base class 中声明构造的成员都必须在 child 中作为静态成员重新声明和重建(重新初始化)(与变量 "uplimit" 和 "downlimit" 没有区别)并且它是最大的继承的想法。那么问题是什么?
这是我找到的最佳答案:c++ Child class Unable to initialize Base class's member variable?
但是 "this is because the base class (and by extension, all its data members) are initialized before the derived class and any of its members" 这句话对我来说不清楚。构造函数不是用来重新初始化变量的吗,即使它之前已经完成了?
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(){
}
parent object 的构造函数在 RandUniform 构造函数之前被调用。这就是编译器感到困惑的原因,您设置的成员已经声明(基本上就像写 int i; int i;
)。当您的 parent class 有一个复杂的初始化方法时,这真的很舒服。
为什么我不知道它是否被认为是最佳实践。但我通常让我的 parent object 支持受保护的 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);
}
您只能初始化一次对象。之后你只能分配它们:
RandUniform::RandUniform() : downlimit(0), uplimit(1)
{
mean = 0.5;
sigma = sqrt(1./12);
}
或者,您可以将基础 class 变量的初始化委托给基础 class 构造函数:
//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)
{}
child class "RandomUniform" 中的构造函数旨在重新初始化 Mother class "RandomVar" 的成员 "mean" 和 "sigma" 如果对象创建变得均匀。但是我得到了错误:mean, sigma "is not a nonstatic data member or base class"。据我了解,所有在 base class 中声明构造的成员都必须在 child 中作为静态成员重新声明和重建(重新初始化)(与变量 "uplimit" 和 "downlimit" 没有区别)并且它是最大的继承的想法。那么问题是什么?
这是我找到的最佳答案:c++ Child class Unable to initialize Base class's member variable? 但是 "this is because the base class (and by extension, all its data members) are initialized before the derived class and any of its members" 这句话对我来说不清楚。构造函数不是用来重新初始化变量的吗,即使它之前已经完成了?
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(){
}
parent object 的构造函数在 RandUniform 构造函数之前被调用。这就是编译器感到困惑的原因,您设置的成员已经声明(基本上就像写 int i; int i;
)。当您的 parent class 有一个复杂的初始化方法时,这真的很舒服。
为什么我不知道它是否被认为是最佳实践。但我通常让我的 parent object 支持受保护的 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);
}
您只能初始化一次对象。之后你只能分配它们:
RandUniform::RandUniform() : downlimit(0), uplimit(1)
{
mean = 0.5;
sigma = sqrt(1./12);
}
或者,您可以将基础 class 变量的初始化委托给基础 class 构造函数:
//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)
{}