C++ 是否有初始值设定项列表的替代方案?
我有C++ 是否有初始值设定项列表的替代方案?,c++,object,constructor,initialization,initializer-list,C++,Object,Constructor,Initialization,Initializer List,我有SmallClass和BigClassBigClass作为属于SmallClass对象的私有属性。我已经读过初始化列表,但问题是我无法预测需要传递给SmallClass的构造函数的值。代码如下所示: class SmallClass { public: SmallClass(int); private: int boo; } SmallClass::SmallClass(int i) { boo = i; } class BigClass { public
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? */
}
我建议采取一种变通办法:
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 */
}
是否有初始值设定项列表的替代方案
对。默认成员初始值设定项是初始值设定项列表的替代项。但是,这对您的案例没有用处。事实上,只有当构造函数的参数是可预测的时,它才有用
foo
的“不可预测性”对于初始值设定项lits来说不是问题;你不需要其他选择。只需调用一个函数:
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
什么是do stuff
之前初始化的成员?为什么foo
的计算不能进入一个小的实用函数,这个函数做事情
?@StoryTeller我可以想到一个例子-BigClass
ctor调用一些外部API,返回foo
和bar
,我们想把foo
传递到SmallClass
和bar
的某个地方else@Kos-一切都很好。但这是OP需要包括的一个细节,让人们知道他们更好地避免回答这些问题。为每个人节省了不少时间(包括OP)。您是否尝试过创建一个“执行任务”的函数,然后在初始值设定项列表中为SmallClass
构造函数调用该函数?像BigClass::BigClass():sc(DoStuff()){}
?@StoryTeller如果这个问题缺少上下文,我很抱歉。我试着将它与我所尝试的完全分离BigClass
有更多的成员,其中一个是对象,其状态在BigClass
的构造函数中以随机方式改变(就像一副牌)。在设置foo
的值之前,我需要读取所述卡片组的状态(并在阅读时更改)。我认为注释中已经建议的解决方法更好。当我编写解决方法时,没有编写任何内容。顺便说一句,你可以想你想要什么。“如果‘做事情’包括访问成员,那么你可以使用成员函数来实现。”-呃,不,你不能。我的意思是,你可以,如果未定义的行为是可以接受的。否则,在运行c'tor之前调用访问成员数据的成员函数不会有好的结果。@IInspectable在构造函数(包括成员初始值设定项列表)中访问成员或调用成员函数是不可能的。但是您需要小心,只访问已经初始化的成员。这仍然是不完整的。如果你建议调用一个成员函数来访问非静态类成员,你必须解释,在调用<代码> GETSIFOWE()/C++ >之前,初始化了哪些类成员。我提到了成员访问,因为这可能并不明显。我现在提到必须初始化该成员,因为这可能会被忽略。但是我发现很明显,要找出初始化了哪些成员,程序员必须知道初始化的顺序。我相信,对于这一点,存在着一个单独的问题和答案。