我有课程SmallClass
和BigClass
。 BigClass
作为私有属性,是SmallClass
的对象。我已经阅读了有关初始化列表的信息,但问题是我无法预测我需要传递给SmallClass
的构造函数的值。代码看起来像这样:
class SmallClass {
public:
SmallClass(int);
private:
int boo;
}
SmallClass::SmallClass(int i) {
boo = i;
}
class BigClass {
public:
BigClass();
private:
SmallClass sc; // I guess this calls the constructor (and does not compile)
};
BigClass::BigClass() {
int foo;
/* Do stuff. I end up with a "foo" having a non predictable value. */
sc = SmallClass(foo); /* Is there a way to do something like this? */
}
答案 0 :(得分:2)
是否有替代初始化程序列表?
是。默认成员初始值设定项是初始化列表的替代方法。但是,这对您的情况没有用。实际上,只有当构造函数的参数可预测时才有用。
foo
的“不可预测性”对初始化器来说不是问题;你不需要替代品。只需调用一个函数:
int get_foo() {
int foo;
/* Do stuff. I end up with a "foo" having a non predictable value. */
return foo;
}
BigClass::BigClass() : sc(get_foo()) {}
如果“do stuff”包括访问成员(示例中没有其他成员,我认为它可能是一种简化),那么您可以使用成员函数来实现。但请注意,您只能访问在sc
之前初始化的成员。
答案 1 :(得分:1)
我建议解决方法:
class SmallClass
{
public:
SmallClass();
public:
void SetBoo(int value);
private:
int boo;
};
SmallClass::SmallClass()
{
boo = 0;
}
void SmallClass::SetBoo(int value)
{
boo = value;
}
class BigClass
{
public:
BigClass();
private:
SmallClass sc; // I guess this calls the constructor (and does not compile)
};
BigClass::BigClass()
{
int foo;
/* Do stuff. I end up with a "foo" having a non predictable value. */
sc.SetBoo(foo); /* Yes, you can set the boo member */
}