c++ - 对象在列表中添加和删除自身

标签 c++ inheritance shared-ptr ownership

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

层次结构:

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

那里还有一些其他类(class)。我可以使用虚拟继承来处理菱形继承(钻石问题),所以这不是什么大问题。另外,我将为它们每个类型定义一些shared_ptr 和weak_ptr。

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

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

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

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

谢谢!

最佳答案

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

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

然后这样调用它:

MyClass *c = myNew<MyClass>();

关于c++ - 对象在列表中添加和删除自身,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10845483/

相关文章:

c++ - C++ 中的 Eigen MatrixXd 推回

c# - 如何解锁 ConnectNamedPipe 和 ReadFile? [C#]

java - 跨并行继承层次结构访问方法

python:从内置类型列表继承,如何访问新类中的元素?

c++ - 为什么 boost shared_ptr 原子操作会导致 SIGSEGV

c++ - clang - shared_ptr 无法运行其删除程序

c++ - Visual C++ 10(又名 2010)与 Visual C++ 9(又名 2008)相比

c++ - 实现特定 std::mbstate_t 的大小

Scala:如何使子类(在其他实例上)可以访问 protected 方法?

c++ - 初始化引用的 shared_ptr ( std::tr1::shared_ptr<class&> )