提升shared_ptr和'this'

时间:2010-07-12 16:45:06

标签: c++ boost shared-ptr

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

我有

typedef boost::shared_ptr<Parent> ParentPtr

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

我需要子实例指向其父级。

class Child
{
 ....
     ParentPtr m_parent;
 ....
}

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

问题:如何给孩子一个ParentPtr

尝试(1)。在Parent :: ChildFactory

child->m_parent.reset(this);

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

尝试(2)。家长

ParentPtr m_me;

从父工厂的返回值复制而来。所以我可以做到

child->m_parent = m_me;

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

2 个答案:

答案 0 :(得分: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的共享指针(假设有一个)。

E.g。

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

答案 1 :(得分:0)

由于其他响应已指出,首先您必须使用enable_shared_from_this来获取shared_ptr,但子无法持有该引用,必须使用weak_ptrweak_ptrshared_ptr类似,只是在您调用get()方法之前它不会保留引用,这会返回正常的shared_ptr,您应该得到你可以尽快摆脱孩子。