现代C++对象关系

Agn*_*ian 2 c++ oop smart-pointers object

我有一个使用a struct Node和a 实现的图表struct Edge:

  • 每个Edge都有一个开始和结束Node
  • 每个都Node维护一个Edge从它开始或结束的对象列表

以下是一种可能的实现:

struct Node;

struct Edge {
  Node *st;
  Node *en;
  int some_data;
};

const int MAX_EDGES = 100;
struct Node {
  Edge *edges[MAX_EDGES];
  int some_data;
};
Run Code Online (Sandbox Code Playgroud)

虽然上面的结构可以代表我想到的图形,但我希望在满足以下要求的同时采用"Modern C++"方式:

  1. 避免指针
  2. 使用std::vectorforNode::edges
  3. 能够在标准C++容器中存储NodeEdge对象

这在Modern C++中是如何完成的?可以实现1-3的全部吗?

Jon*_*ely 8

  1. 避免指针

你可以使用std::shared_ptrstd::weak_ptr为此.只需决定是否希望节点拥有边缘,反之亦然.非拥有类型应该使用weak_ptr(避免循环).

除非您的图表是非循环的,否则您可能仍需要注意所有权周期.

std::unique_ptr 不是一个选项,因为节点和边之间没有一对一的关系,因此不能有任何给定对象的唯一所有者.

  1. 对Node :: edges使用std :: vector

没问题.使它成为std::vector<std::weak_ptr<Edge>>std::vector<std::shared_ptr<Edge>>(取决于边缘是否自己的节点,反之亦然)

  1. 能够将Node和Edge对象存储在标准C++容器中

没问题,只需确保您的类型可以安全地移动/复制而不会泄漏或损坏内存,即具有正确的复制/移动构造函数和赋值运算符.如果您使用智能指针并std::vector如上所述,这将自动发生.