如何在类层次结构中传递智能指针
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 正是我想要的。
【讨论】:
以上是关于如何在类层次结构中传递智能指针的主要内容,如果未能解决你的问题,请参考以下文章