如何正确初始化非默认可构造的类成员?

mad*_*ax1 4 c++ constructor initialization class member

假设我定义了一个类Foo,它没有实现默认的构造函数.另外,我有一个类Bar,它"拥有"一个实例Foo:

class Foo() {
  private:
    int m_member;
  public:
    Foo( int value ) : m_member(value) { }
};

class Bar() {
  private:
    Foo m_foo;
  public:
    Bar( /* ... */ ) {
      int something;
      /* lots of code to determine 'something' */
      /* should initialize m_foo to 'Foo(something)' here */
    }
};
Run Code Online (Sandbox Code Playgroud)

显示的代码将无法运行,因为它Bar正在尝试调用默认构造函数Foo.

现在我要做的是先让构造函数Bar确定something,然后将结果传递给构造函数Foo.

解决此问题的一种方法是在确定之后Bar仅拥有一个引用/指针Foo并对其进行初始化m_something.但是,我想避免这一点,以明确生命周期m_foo完全取决于拥有类的生命周期.

另一种方法是实现一个默认构造函数Foo并稍后设置该值,我也想避免,因为任何实例都Foo应该为其成员提供有效值(在任何时候).

实现这个的正确方法是什么?我在这里坚持使用参考/指针吗?

For*_*veR 12

最好的想法是创建辅助函数,它将计算一些东西然后只m_foo在构造函数初始化列表中初始化.

class Bar {
  private:
    Foo m_foo;
  public:
    Bar( /* ... */ ) : m_foo(calculate_something()) {
    }
private:
    static int calculate_something()
    {
       int something = 0;
       // lot of code to calculate something
       return something;
    }
};
Run Code Online (Sandbox Code Playgroud)