是否有初始值设定项列表的替代方法



我有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? */
}

是否有初始值设定项列表的替代方法?

是的。默认成员初始值设定项是初始值设定项列表的替代方法。但是,这对您的情况没有用。事实上,它仅在构造函数的参数预测时才有用。

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 之前初始化的成员。

我建议一个解决方法:

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

最新更新