是否有初始化列表的替代方案?

时间:2018-03-16 10:42:18

标签: c++ object constructor initialization initializer-list

我有课程SmallClassBigClassBigClass作为私有属性,是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? */
}

2 个答案:

答案 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 */
}