【问题标题】:boost shared_ptr and 'this'提升 shared_ptr 和 'this'
【发布时间】:2023-03-03 10:26:01
【问题描述】:

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

我有

typedef boost::shared_ptr<Parent> ParentPtr

在父类中创建子类的方法

我需要子实例具有指向其父实例的指针。

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

我希望它是一个 shared_ptr,这样当有现有的孩子时,父母就不会消失。我也有其他人持有 ParentPtrs 给父母(父母的工厂方法返回一个 ParentPtr)

问题:如何给孩子一个ParentPtr

尝试 (1) 。在 Parent::ChildFactory

child->m_parent.reset(this);

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

尝试 (2)。父母有

ParentPtr m_me;

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

child->m_parent = m_me;

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

【问题讨论】:

    标签: c++ boost shared-ptr


    【解决方案1】:

    我很确定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();
        }
    };
    

    【讨论】:

    • @pm100:为什么需要使用weak_ptr?如果孩子拥有他们的父母(在他们之间共享),那么您需要使用shared_ptrweak_ptr 并不意味着所有权。
    • 哦,是的,你是对的 - 我在想一个不同的解决方案 - 删除编辑
    • 我本可以让父级有一个指向自身的弱指针,它可以用来生成可以传递给子级的 shared_ptr(比如我的 m_me),但是 enable_share 使得这没有必要(我怀疑这就是它在引擎盖下所做的)
    【解决方案2】:

    由于另一个响应有指针,首先您必须使用enable_shared_from_this 来获取shared_ptr,但随后孩子无法持有该引用,它必须使用weak_ptrweak_ptr 就像 shared_ptr 一样,只是在您调用 get() 方法之前它不会持有引用,这将返回一个正常的 shared_ptr,您应该尽快将其删除孩子。

    【讨论】:

    • 你为什么这么认为?该模型是孩子(与“其他人”一起)拥有他们的父母;父母不拥有孩子。如果孩子使用弱指针,那么它不会阻止父母在他们仍然有孩子存在时“消失”。
    • @Charles 对不起,我的错。我假设没有明确提及的事情:我假设如果使用shared_ptrweak_ptr,父母将对他们的孩子进行参考。我假设,只是因为默认情况下,父母控制他们的孩子,直到他们至少年满 18 岁并离开家。如果是反过来,请忽略我所说的一切。
    • 嗯,我不知道 pm100 的代码结构到底是什么,但我的推理是,如果他担心父母在他们还有孩子的时候被摧毁,那么父类就不能拥有(直接按值或通过shared_ptr) 子类,否则它甚至不会被考虑。所有权关系将确保孩子不会比其最后一位父母活得更久。事实上,我的理解是,所需的所有权是相反的:“我希望它是一个 shared_ptr,这样当有现有的孩子时,父母就不会消失。”
    • 嗯,我想这取决于代码是什么样的,但无论如何,在我们之间,我们提供了他可能需要的一切,无论是哪种方式。 ;-)
    猜你喜欢
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 2011-06-19
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    相关资源
    最近更新 更多