智能指针+周期+" - >"

Krz*_*wek 10 c++ smart-pointers shared-ptr weak-ptr c++11

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

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

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

我在StackOverflow上阅读了一些文章,参考和主题,但看起来我仍然没有得到智能指针.真的,为什么不存在一些带有" - >"的weak_ptr变体?

Rei*_*ica 30

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

每个对象是否都有一个明确定义的所有者(例如,图表拥有其所有顶点和边缘)?如果是这样,用于std::unique_ptr保持图形中的顶点和边,并使用顶点和边内的原始指针来相互引用.

共享所有权是否适用(例如,只要至少有一个边连接到顶点,就只存在一个顶点)?如果是这样,请使用std::shared_ptr表示所有权,再次使用非拥有观察者的原始指针.如果你需要相互所有权(即所有权周期),其中"只要一个边缘引用它就存在一个顶点,只要一个顶点引用它就存在一个边缘",那么1.仔细检查这样的设计是正确和可维护,以及2.如果是这样,请std::weak_ptr在周期中的某处使用以打破所有权循环.您可以随时lock()weak_ptr来获得shared_ptr.

对于您的特定图表场景,我相信"图表所拥有的一切"将是最合乎逻辑的所有权方案; 但这取决于你的任务的特质.

  • @KrzysztofStanisławek是的,确切地说.Herb sutter有[:几个:](http://herbsutter.com/elements-of-modern-c-style/)[:articles:](http://herbsutter.com/2013/06/05/gotw- 91-solution-smart-pointer-parameters /)就此而言.还有一个[关于SO的问题](http://stackoverflow.com/q/8338570/1782465). (2认同)
  • 我喜欢这个答案,但我想指出`weak_ptr`只能静态地打破循环,即在编译时已知的循环. (2认同)