我有一个小的层次结构,我正在试图找出一种维护所有权的简单方法。由于这些对象驻留在堆上,因为我讨厌原始指针,我想我将使用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是不好的。
如何让对象在构造函数中自动将共享或弱指针插入到列表中?这是个坏主意吗?
(同样在上面的“代码”中,我可能搞砸了虚拟继承语法,但这不是我现在所关注的,所以不要担心。)
谢谢!
答案 0 :(得分:1)
您可以使用模板只使用一种工厂方法:
template <typename T>
T *myNew() {
T *t = new T();
t->push_to_list();
return t;
}
然后这样称呼它:
MyClass *c = myNew<MyClass>();
答案 1 :(得分:1)
我不明白你为什么要打扰弱点。
我认为您的问题不是您要问的具体问题,而是您的设计问题。从本质上讲,你使用全局变量,这通常是一个坏主意。实际上,你可能应该有某种World
对象,World
所拥有的东西是世界上所有演员的集合,所有正文的列表,等等。
因此,您的典型构造是,例如,创建一个新的Combatant
并将其填充到世界中。或者也许你的世界有一个spawnCombatant
。