c++ - 智能指针+循环+ "->"

标签 c++ c++11 shared-ptr smart-pointers weak-ptr

有时候我真的很确定我想要指针的循环依赖,循环上的每个对象都应该能够使用他的指针(所以不能是weak_ptr)。

我的问题是:这是否意味着我的设计不好?

如果我想实现图形怎么办?我可以使用智能指针吗?在图表中有循环,但对于 weak_ptr 我不能使用“->”。我能做什么?

我在 StackOverflow 上阅读了一些文章、引用资料和主题,但看起来我仍然没有得到智能指针。真的,为什么不存在带有“->”的 weak_ptr 的一些变体?

最佳答案

从概念方面而不是实现方面来解决这个问题。智能指针代表所有权。并且智能指针的存在不会使原始指针作为非拥有观察者的角色无效。

是否每个对象都有一个明确定义的所有者(例如,一个图拥有它的所有顶点和边)?如果是这样,使用 std::unique_ptr 保存图中的顶点和边,并在顶点和边内使用原始指针相互引用。

共享所有权是否适用(例如,只要至少有一条边与其相连,顶点就存在)?如果是这样,请使用 std::shared_ptr 来表示该所有权,同样为非拥有观察者使用原始指针。如果您需要相互所有权(即所有权循环),其中“顶点仅在边引用时存在,边仅在顶点引用时存在”,那么 1. 仔细检查这样的设计是正确且可维护,并且 2. 如果是这样,请在循环中的某处使用 std::weak_ptr 来打破所有权循环。你总是可以lock()一个weak_ptr来获得一个shared_ptr

对于您的特定图形场景,我相信“图形拥有一切”将是最合乎逻辑的所有权方案;但这取决于您的任务的特殊性。

关于c++ - 智能指针+循环+ "->",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23408810/

相关文章:

c++ - 安全的 std::tr1::shared_ptr 用法

c++ - Rcpp Armadillo "ReferenceInputParameter is not a template"

c++ - 所有权应该在 STL 容器调用其值的析构函数之前还是之后结束?

c++ - std::thread 错误(线程不是 std 的成员)

c++ - 如何在 C++ 中将两个元组作为参数发送

c++ - 为什么没有 std::shared_ptr<T[]> 特化?

c++ - 当 use_cout() == 1 时 shared_ptr 没有被销毁

c++ - 我可以在带有 Cmake 2.8.12.2 的 ubuntu 14.04 上为 C++ 使用 biicode 吗?

C++ - 堆与堆栈属性

c++ - GLSL 传递整数顶点属性