我有两个有父子关系的课程(客户和订单目录&文件等)
我有
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永远不会死,因为它拥有对自身的引用
答案 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_ptr
。 weak_ptr
与shared_ptr
类似,只是在您调用get()
方法之前它不会保留引用,这会返回正常的shared_ptr
,您应该得到你可以尽快摆脱孩子。