在初始化列表中初始化对象

Initialize object in initializer list

本文关键字:初始化 对象 列表      更新时间:2023-10-16

我有一个class Foo,我需要初始化对另一个类的引用,但首先我需要从另一个类获得一些引用接口。

这只是一个虚拟代码,以便更好地解释我的两个问题:

class Foo
{
public:
  Foo();
  ~Foo();
private:
  int m_number;
  OtherClass& m_foo;
};
Foo::Foo() :
  m_number(10)
{
  // I really need to do this get's
  Class1& c1 = Singleton::getC1();
  Class2& c2 = c1.getC2();
  Class3& c3 = c2.getC3();
  //How can I put the m_foo initialization in the initialization list?
  m_foo(c3);
}

问题是:

1 -在初始化成员m_foo之前,我需要检索上面所有的引用。但是我想初始化初始化列表中的m_foo。最好的方法是什么,而不是在一行中。有办法吗?

2 -执行上面的代码,我得到错误:

error: uninitialized reference member 'OtherClass::m_foo' [-fpermissive]

因为我用圆括号进行初始化就像在初始化列表中一样。我怎样才能正确地初始化m_foo ?

可以使用委托构造函数(c++ 11以后):

class Foo
{
public:
    Foo() : Foo(Singleton::getC1()) {}
private:
    explicit Foo(Class1& c1) : Foo(c1, c1.getC2()) {}
    Foo(Class1& c1, Class2& c2) : Foo(c1, c2, c2.getC3()) {}
    Foo(Class1& c1, Class2& c2, Class3& c3) : m_number(10), m_foo(c3)
    {
        // other stuff with C1, c2, c3
    }
    // ...
};