【发布时间】:2021-09-16 11:04:00
【问题描述】:
这是一个更普遍的问题,我正在尝试解决 C++ 最佳实践。假设我想创建存储相互引用的对象,例如图形。所有对象都属于同一个对象,就像一个Graph对象属于所有Node,也就是说所有权是固定的。
这是我的想法:一个类 Graph 有一个 std::vector 的节点,每个节点都有一个 std::vector 的节点代表它的连接列表。我想知道如何最好地在智能指针方面实现这一点?据我了解,所有权是唯一的,因此 Graph 向量应该是 std::vector<std::unique_ptr<Node>> nodes,我可以根据需要填充它。但是connections 向量,如何让每个节点存储对其连接的引用?这些只是只读引用,也许最好命名所有节点并仅存储名称,或者将连接存储在 Graph 中。但是有没有一种很好的方法来存储对连接节点的引用,就好像它们是 const 指针一样?
注意:这实际上是关于所有权和智能指针,而不是数据结构,图示例只是一个示例。
【问题讨论】:
-
有趣的是,一张图表是围绕 Herb Sutter 的 gcpp 项目与
deferred_ptrs 的激励性讨论。也就是说:这是一个有点宽泛且可能基于意见的问题,因为它可以通过多种方式解决;在图中具有强unique_ptr的节点上的原始指针查看,或节点中的weak_ptr和Graph中的shared_ptrs,或者像deferred_ptrs 这样更奇特的东西。没有什么本质上是“正确的”或“错误的”——这取决于用例和所需的质量属性 -
@Human-Compiler 我明白你的观点是基于意见的,所以也许我可以改变问题来询问特定方法,答案可能会批评并提供替代方案?
-
您已经对所提出的问题有了答案——我会犹豫是否要以可能使现有答案无效的方式更改它(这会使回答者感到不安)。无论哪种方式,这都不是一个坏问题
标签: c++ reference smart-pointers move-semantics