指向所有者类的指针

时间:2013-09-01 23:29:57

标签: c++ c++11

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如果您不想使用shared_from_this并且由于某种原因确实想要使用shared_ptrweak_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,则shared_ptr无法从指向已共享对象的原始指针中找到引用计数。