【发布时间】: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引用它。从问题中我并不清楚。
标签: c++ pointers smart-pointers