2

我有一个小的类层次结构,我试图找出一种简单的维护所有权的方法。由于这些对象驻留在堆上,而且我讨厌原始指针,我想我将使用 boost 共享指针和弱指针。(我对替代方案持开放态度,但这是我习惯的。)共享指针有助于所有权,因为当共享指针的所有者这样说时,弱指针不会阻止对象被删除。

层次结构:

class Actor;
class Body : public virtual Actor;
class Owned : public virtual Actor;
class Combatant : public Body, public Owned;

那里还有一些其他的课程。我可以使用虚拟继承来处理钻石继承,所以这没什么大不了的。另外,我将为它们中的每一个键入一些 shared_ptrs 和 weak_ptrs。

我的想法是让 Actor 维护一个 Actor 共享指针(ActorPTR)的静态列表,并让子类维护弱指针(BodyWPTR 等)的静态列表。这样就有一个共享指针的明确集合,所以应该管理一些某种所有权(我会尽量不要在其他任何地方永久存储共享指针。)拥有这些列表很方便,因为我可以很快地说,“让我附近的所有战斗人员”或“移动所有尸体”。

我希望对象将自己插入到正确的列表中:Body 会将自身的弱指针插入到 body 弱指针列表中,并将 Actor 共享指针插入到该列表中,这可能在构造函数中完成。但是(显然)在构造函数中使用“this”指针(或它的 shared_from_this() 等效项)是不好的。我能想到的唯一其他方法是通过一大堆工厂方法。我还认为层次结构中的多个类从 enable_shared_from_this 继承是不好的。

如何让对象在其构造函数期间自动将指向自身的共享或弱指针插入到列表中?这是个坏主意吗?

(同样在上面的“代码”中,我可能弄乱了虚拟继承语法,但这不是我现在关心的,所以不用担心。)

谢谢!

4

2 回答 2

1

您可以使用模板仅使用一种工厂方法:

template <typename T>
T *myNew() {
    T *t = new T();
    t->push_to_list();
    return t;
}

然后像这样调用它:

MyClass *c = myNew<MyClass>();
于 2012-06-01T06:45:47.193 回答
1

我不明白你为什么要为弱指针而烦恼。

我认为您的问题不是您要问的具体问题,而是您的设计。本质上,您使用的是全局变量,这通常是个坏主意。确实,您可能应该拥有某种World对象,其中 aWorld拥有的是世界上所有参与者的集合,所有物体的列表,等等。

因此,您的典型构造是,例如,创建一个新的Combatant并将其填充到世界中。或者,也许你的世界有一个spawnCombatant.

于 2012-06-01T06:53:26.277 回答