1

授予一个从自己的类型管理其子级的类,每个子级都有一个指向其父级的指针。

class Class {
    std::array<std::shared_ptr<Class>, 4> children;
    std::weak_ptr<Class> parent;
}

A weak_ptr,就像上面的代码一样,不起作用,因为它必须通过共享 ptr 进行初始化。

void initChild() {
    subtrees[0] = std::make_shared<Class>(std::shared_ptr<Class>(this));
}

这显然会删除this并导致错误。

是否有可能在不使用 raw 的情况下对父级进行弱引用pointers,或者这是唯一的选择?

4

2 回答 2

0

如果您将父指针用作可观察成员(即不是必须分配/销毁的东西),那么原始指针是唯一的方法。

于 2013-09-01T23:37:26.267 回答
0

如果您不想使用shared_from_this并且真的想使用shared_ptr并且weak_ptr出于某种原因,那么您可以创建一个构造 Class 对象的工厂方法,然后从外部设置成员(父和子):

template<class... Args>
shared_ptr<Class> make_class(shared_ptr<Class> parent, size_t childIndex, Args&&... args)
{
      auto p = make_shared<Class>(forward<Args>(args)...);
      p->parent = parent;
      parent->children[childIndex] = p;
      return p;
}

您当然可以将此方法设为静态成员函数,然后将构造函数设为私有,以便用户必须始终使用工厂方法。

问题是,如果没有shared_from_this在目标类中,ashared_ptr就无法从指向已共享对象的原始指针中找到引用计数。

于 2013-09-02T01:19:15.227 回答