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++ >之前,初始化了哪些类成员。我提到了成员访问,因为这可能并不明显。我现在提到必须初始化该成员,因为这可能会被忽略。但是我发现很明显,要找出初始化了哪些成员,程序员必须知道初始化的顺序。我相信,对于这一点,存在着一个单独的问题和答案。