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)
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 +赋值等细节.
Inner::Inner(Outer & o) : m_outer(o) {}
Outer::Outer() : m_inner(*this) {}
Run Code Online (Sandbox Code Playgroud)
那很好.就这样做吧.还要考虑是否Inner可以是嵌套类(对于像迭代器这样的东西,这很有意义.
您还没有说过您尝试建模的内容.应该注意的是,Outer还需要拥有自己的复制构造函数和复制赋值运算符或禁用它.否则,平面副本将导致重大灾难.