两个没有默认构造函数的相互依赖的成员函数

Two interdependent member functions with no default constructor

我确信这个问题必须在某处得到回答,但我无法提出问题... 我的问题是我有两个对象(foobar),其中 bar 需要使用 foo 实例进行初始化。当两个对象都是另一个 class (baz) 的数据成员时,该怎么做?

我无法在 baz 构造函数主体中初始化 bar,因为此时 bar 必须已经使用缺少的默认构造函数进行了初始化。

我无法在 baz 初始化列表中初始化 bar,因为此时 foo 尚未构建。当心编译器不关心!

看例子:

#include <iostream>
#include <memory>

using namespace std;

class foo
{
   public:
      foo() {
         cout << "foo constructor called." << endl;
      }

   private:
};

class bar
{
   public:
      bar(foo inFoo) : mFoo(inFoo) { 
         cout << "bar constructor called." << endl; 
      }

   private:
      foo mFoo;
};

class baz
{
   public:
      baz() : mBar(mFoo) { 
         cout << "baz constructor called." << endl; 
      }  // ERROR: mFoo is not inizilized

   private:
      bar mBar;
      foo mFoo;
      
};

int main()
{
   baz Baz;
}

我想到的唯一解决方法是在 baz class 中使用指针。使用 bar 数据成员的指针允许我将初始化推迟到 baz 构造函数主体。

class baz
{
   public:
      baz() {
         cout << "baz constructor called." << endl;
         mBar = unique_ptr<bar>( new bar(mFoo) );

      }

   private:
      unique_ptr<bar> mBar;
      foo mFoo;

};

但是没有指针是否可以解决这个问题?

由于 mBar 依赖于 mFoo,只需重新排序声明:

private:
    foo mFoo;
    bar mBar;

并先初始化mFoo

baz() : mFoo(), mBar(mFoo) { 
  // ...
}

这里是 demo