[英]Initializing a member class of an object using a non-default constructor in C++
我有一个特定的情况,我有一个对象要使用Boost随机数生成器,它导致了一个更大的问题,我似乎无法回答。 这是我尝试产生的示例代码。
首先,我的标题:
Class MyObject {
protected:
double some variable;
boost::random::mt19937 rgenerator;
boost::uniform_real<double> dist_0_1;
boost::variate_generator< boost::mt19937&, boost::uniform_real<double> > rand01
}
现在我要做的是:
Class MyObject {
protected:
double some variable;
boost::random::mt19937 rgenerator(std::time(0)); //initialize to a "random" seed
boost::uniform_real<double> dist_0_1(0,1); //set the distribution to 0-1
boost::variate_generator< boost::mt19937&, boost::uniform_real<double> > rand01(rgenerator, dist_0_1);//tell it to use the above two objects
}
但这不起作用,因为它在标题中。 我以为我可以使用MyObject的构造函数以某种方式调用各种子对象(分布,生成器)的构造函数,但我不知道怎么做。在调用MyObject的构造函数时,子对象的默认值构造函数已经被调用,但我还没有发现它们具有重置这些属性的成员方法...除此之外,这并不是我感到困惑的地方。现在也许发生了太多事情,而我m令人困惑的问题,但据我所知,我的问题简化为以下幼稚的示例:
Class Tree {
Tree();
Tree(int);
protected:
fruit apples(int);
}
Tree::Tree() {
apples(0); //won't work because we can't call the constructor again?
}
Tree::Tree(int fruit_num) {
apples(fruit_num); //won't work because we can't call the constructor again?
}
Class Fruit {
public:
Fruit();
Fruit(int);
protected:
int number_of_fruit;
}
Fruit::Fruit() {
number_of_fruit = 0;
}
Fruit::Fruit(int number) {
number_of_fruit = number;
}
我确信这是其他所有人的第二天性,但是我找不到一篇文章讨论将对象的成员对象初始化为非默认构造函数值的最佳实践。
您想要的是一个初始化列表。 例如:
Tree::Tree(int fruit_num)
: apples(fruit_num) // Initializes "apple" with "fruit_num"
{
}
您只需添加一个冒号( :
构造函数的参数后和左括号前) {
。 您可以使用逗号( ,
)分隔不同的成员构造函数。 例:
Tree::Tree(int fruit1, int fruit2) : apples(fruit1), bananas(fruit2) {
}
这个问题的答案是相对简单的。 您使用初始化列表。
这是一个例子:
class MyClass {
private:
SomeOtherType sot;
public:
MyClass() : sot(parametersForConstructorOfSOT) {}
};
当然,您可以将其扩展到多个成员对象。 如果您需要执行此操作,它也可以用于调用父类的构造函数以初始化父类中的私有条目。
你好亲密! 只需使用初始化程序列表语法:
Tree::Tree() : apples(0) {
// ...
}
Tree::Tree(int fruit_num) : apples(fruit_num) {
// ...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.