授予一个从其自己的类型管理其子节点的类,每个子节点都有一个指向其父节点的指针。
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
的情况下对父级进行弱引用,或者这是唯一的选择?
答案 0 :(得分:0)
如果您使用父指针作为可观察成员(即不是必须分配/销毁的东西),原始指针是唯一的方法。
答案 1 :(得分: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
,则shared_ptr
无法从指向已共享对象的原始指针中找到引用计数。