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的解决方案非常满意.
而不是构造函数,使用函数来构建图的节点.
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.
基本上,你不能.你需要一个shared_ptr或weak_ptr一个,weak_ptr而且显然自我只能以其shared_ptr形式意识到它自己weak_ptr(否则计算引用没有意义).当然,shared_ptr当物体尚未构建时,可能没有自我.
| 归档时间: |
|
| 查看次数: |
3276 次 |
| 最近记录: |