有时候我真的很确定我想要指针的循环依赖,循环上的每个对象都应该能够使用他的指针(所以不能是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/