c ++:成员,引用父

pet*_*hen 2 c++ constructor member

我正在寻找一个好的模式来实现以下内容:

class Outer;


class Inner
{
     Outer * m_outer;

   public:
     InitOuter(Outer * o) { m_outer = o; }
}

class Outer
{
    Inner  m_inner;

  public:
    Outer()
    {
      m_inner.InitOuter(outer);
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 应始终使用对外部的引用来创建内部
  • m_outer永远不会为NULL
  • m_outer在生命周期内不会改变 Inner

不幸的是,据我所知,m_outer不能既不是引用也不是不可变指针,因为以下初始化无效:

Inner::Inner(Outer & o) : m_outer(o) {}
Outer::Outer() : m_inner(*this) {}
Run Code Online (Sandbox Code Playgroud)

因为在初始化时m_inner,Outer没有完全构造,因此this是无效的(并且也可能在初始化期间改变).

我找到的唯一选择是制作Inner非公开的构造函数,以及它Outer的朋友Inner.这有点好,但"朋友"关系似乎是任意强大的(因为通常内部类应该封装功能).

你是如何实现的?


动机:在我对C++的理解中,"外部"还没有完全构建,因此访问this可能会合法地触发未定义的行为(任何人都可以确认这一点 - 或者甚至更好,事实并非如此?).


不,我不需要在这里控制反转.真的,谢谢你,但没有.
我省略了隐藏副本CTor +赋值等细节.

Joh*_*itb 8

Inner::Inner(Outer & o) : m_outer(o) {}
Outer::Outer() : m_inner(*this) {}
Run Code Online (Sandbox Code Playgroud)

那很好.就这样做吧.还要考虑是否Inner可以是嵌套类(对于像迭代器这样的东西,这很有意义.

您还没有说过您尝试建模的内容.应该注意的是,Outer还需要拥有自己的复制构造函数和复制赋值运算符或禁用它.否则,平面副本将导致重大灾难.