如何在类层次结构中传递智能指针

Posted

技术标签:

【中文标题】如何在类层次结构中传递智能指针【英文标题】:How to pass smart pointers in a class Hirarchy 【发布时间】:2019-10-14 08:17:45 【问题描述】:

所以,我试图弄清楚,如何在对象层次结构中的对象之间传递指针。 我写的实际程序是一个基于组件的游戏引擎,但我会尽量分解问题。

我的 Current Hirarchy 看起来像这样,我有 3 个类,一个父类,它基本上控制着所有子对象的生命周期,如果它被破坏,其他一切都会随之而来:

Parent.h:

    class Parent
    
    private:
        std::vector<std::shared_ptr<Object>> objects;
    ;

一个中间对象,控制其子对象的生命周期:

Object.h:

    class Object
    
    public:
        Parent* parent;

    private:
        std::vector<std::shared_ptr<Child>> childObjects;
    ;

还有一个子对象:

Child.h:

    class Child
    
    public:

        std::weak_ptr<Object> parent;
    ;

现在的问题是,子对象需要对其父对象的引用,但是拥有子父对象的所有共享指针都存在于全局父对象中,并且只需从指向子父对象的指针创建一个弱指针即可不工作。

我提出了两个解决方案,要么将一个普通指针传递给 Child,然后让孩子遍历到 Global parent,然后在那里获取弱指针,这需要在向量中找到指向 childs parent 的指针并且可能并不总是可行的。

我的另一个解决方案是将一个弱指针传递给孩子的父构造函数,并将一个指向自身的弱指针存储在孩子的父母中,这看起来有点乱。

我现在问我是否错过了一些更好的解决方案。

【问题讨论】:

如果这些类是子对象的唯一管理者,那么你应该使用std::unique_ptr,而不是std::shared_ptr,然后子对象可以简单地获取一个指向其父对象的原始指针,这将永远存在它。 否则,shared_from_this 可能会有所帮助。 @uneven_mark 子对象必须有指向其父对象的弱指针,因为它们可能被位于另一个中间对象下的其他子对象引用,因此可能引用已破坏的子对象跨度> @ErikSchulze 好吧,但是A Middle Object, that governs the lifetime of its child objects: 不是真的,因为Child 的生命周期应该延长,直到没有其他Child 引用它。从问题中我并不清楚。 【参考方案1】:

谢谢你, shared_from_this 正是我想要的。

【讨论】:

以上是关于如何在类层次结构中传递智能指针的主要内容,如果未能解决你的问题,请参考以下文章

智能指针如何影响 5 规则?

再论智能指针(上)

如何将智能指针传递给函数?

Visual Studio中智能指针对象的自定义视图?

工厂:如何将临时智能指针传递给函数。 C++

如何用智能指针构造树结构?