提升shared_ptr和'this'

pm1*_*100 5 c++ boost shared-ptr

我有两个有父子关系的类(客户和订单目录及文件等)

我有

typedef boost::shared_ptr<Parent> ParentPtr
Run Code Online (Sandbox Code Playgroud)

在父类中,有一个制作孩子的方法

我需要子实例来指向其父级.

class Child
{
 ....
     ParentPtr m_parent;
 ....
}
Run Code Online (Sandbox Code Playgroud)

我希望它是一个shared_ptr,以便在存在子节点时父节点不会消失.我还有其他人将ParentPtrs保存到父级(Parent的工厂方法返回ParentPtr)

问题:如何给孩子一个ParentPtr

尝试(1).在Parent :: ChildFactory中

child->m_parent.reset(this);
Run Code Online (Sandbox Code Playgroud)

这导致非常糟糕的事情.现在有2个ParentPtr'链'指向父母; 结果是父母过早死亡

尝试(2).父母有

ParentPtr m_me;
Run Code Online (Sandbox Code Playgroud)

这是从父工厂的返回值复制的.所以我能做到

child->m_parent = m_me;
Run Code Online (Sandbox Code Playgroud)

但是现在Parent永远不会死,因为它拥有对自身的引用

CB *_*ley 8

我很确定能enable_shared_from_this解决您的问题:http://live.boost.org/doc/libs/1_43_0/libs/smart_ptr/enable_shared_from_this.html

如果从特化中派生出类,boost::enable_shared_from_this则可以shared_from_this()在成员函数中使用以获取拥有的共享指针this(假设有一个).

例如

class Parent : public boost::enable_shared_from_this<Parent>
{
    void MakeParentOf(Child& c)
    {
        c.m_parent = shared_from_this();
    }
};
Run Code Online (Sandbox Code Playgroud)