2010-07-12 59 views
5

我有两个班,一个父子关系(客户&为了目录&文件等)升压shared_ptr的和“这个”

typedef boost::shared_ptr<Parent> ParentPtr 

,并在父类中做出的方法孩子

我需要子实例指向其父。

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

我希望它是一个shared_ptr,以便在存在子项时父项不会消失。我也有其他人拿着ParentPtrs父(家长工厂方法返回一个ParentPtr)

问题:怎样才能给孩子一个ParentPtr

尝试(1)。 In Parent :: ChildFactory

child->m_parent.reset(this); 

这会导致很糟糕的结果。现在有2个ParentPtr'连锁'指向父母;结果是父母过早死亡

尝试(2)。 Parent has

ParentPtr m_me; 

它从Parent工厂的返回值中复制而来。所以我可以做

child->m_parent = m_me; 

但现在家长永远不会死,因为它拥有自身

回答

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(); 
    } 
}; 
+0

最佳答案 - 谢谢 – pm100 2010-07-12 18:07:22

+0

@ pm100:为什么你需要使用'weak_ptr'?如果孩子拥有他们的父母(在他们之间共享),那么你需要使用'shared_ptr'。 “weak_ptr”并不意味着所有权。 – 2010-07-12 18:51:45

+0

哦,你是对的 - 我正在考虑一个不同的解决方案 - 删除编辑 – pm100 2010-07-12 21:20:56

0

至于其他的响应具有指针OUT,首先你必须使用enable_shared_from_this得到shared_ptr,但随后孩子不能认为裁判,就必须使用一个weak_ptr。 A weak_ptr就像shared_ptr一样,只是在调用get()方法之前它不会保留引用,它会返回一个正常的shared_ptr,您应该尽快将其排除在孩子身上。

+0

你为什么这么认为?模型是孩子们(和“其他人”一起)拥有他们的父母;父母不拥有孩子。如果孩子们使用弱指针,那么当他们仍然有孩子时,它不会阻止父母“消失”。 – 2010-07-12 18:53:57

+0

@Charles对不起,我的坏。我假设没有明确提到的东西:我假设如果使用'shared_ptr'和'weak_ptr',父母将把ref列给他们的孩子。我认为,因为默认情况下,父母控制自己的孩子,直到他们至少18岁才离开家。如果相反,请忽略我所说的一切。 – Gianni 2010-07-12 20:29:44

+0

嗯,我不确切知道pm100代码的结构是什么,但是我推测如果他担心父母在他们还有孩子时被破坏,那么父母班不能拥有(直接通过价值或通过'shared_ptr')子类,否则它甚至不会被考虑。所有权关系将确保儿童无法活过最后一位家长。事实上,我的理解是所需的所有权是相反的:“我希望它是一个shared_ptr,以便父母在有现有子女时不会消失。” – 2010-07-12 21:10:00