如何在构造函数中将weak_ptrs传递给它?

Omn*_*ous 9 c++ shared-ptr c++11

我正在创建一个将成为DAG一部分的类.构造函数将获取指向其他实例的指针,并使用它们初始化依赖项列表.
初始化依赖列表后,只能缩短它 - 实例永远不能作为自身或其任何子项的依赖项添加.

::std::shared_ptr处理这个是很自然的.对处理DAG进行了参考计数.

不幸的是,依赖关系需要知道它们的依赖 - 当依赖关系被更新时,它需要告诉它所有的依赖.
这创造了一个可以打破的微不足道的循环::std::weak_ptr.依赖关系可以忘掉那些消失的家属.

但我无法找到一种方法让依赖::std::weak_ptr者在构建时创建一个自己.

这不起作用:

object::object(shared_ptr<object> dependency)
{
     weak_ptr<object> me = shared_from_this();
     dependency->add_dependent(me);
     dependencies_.push_back(dependency);
}
Run Code Online (Sandbox Code Playgroud)

该代码导致在构造函数退出之前调用析构函数.

有没有一个很好的方法来处理这个问题?我对使用C++ 11的解决方案非常满意.

Fre*_*Foo 9

而不是构造函数,使用函数来构建图的节点.

std::shared_ptr<Node> mk_node(std::vector<std::shared_ptr<Node>> const &dependencies)
{
    std::shared_ptr<Node> np(new Node(dependencies));
    for (size_t i=0; i<dependencies.size(); i++)
        dependencies[i].add_dependent(np);       // makes a weak_ptr copy of np
    return np;
}
Run Code Online (Sandbox Code Playgroud)

如果你把这个static成员函数或friend你的Node类,你可以使实际构造private.

  • 这就是`enable_shared_from_this`已经做到的.你的声明中也有一个迷路* - 你想要一个shared_ptr,而不是指向shared_ptr的指针.:) (2认同)

Mic*_*ker 5

基本上,你不能.你需要一个shared_ptrweak_ptr一个,weak_ptr而且显然自我只能以其shared_ptr形式意识到它自己weak_ptr(否则计算引用没有意义).当然,shared_ptr当物体尚未构建时,可能没有自我.