Agn*_*ian 2 c++ oop smart-pointers object
我有一个使用a struct Node和a 实现的图表struct Edge:
Edge都有一个开始和结束NodeNode维护一个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++"方式:
std::vectorforNode::edgesNode和Edge对象这在Modern C++中是如何完成的?可以实现1-3的全部吗?
- 避免指针
你可以使用std::shared_ptr和std::weak_ptr为此.只需决定是否希望节点拥有边缘,反之亦然.非拥有类型应该使用weak_ptr(避免循环).
除非您的图表是非循环的,否则您可能仍需要注意所有权周期.
std::unique_ptr 不是一个选项,因为节点和边之间没有一对一的关系,因此不能有任何给定对象的唯一所有者.
- 对Node :: edges使用std :: vector
没问题.使它成为std::vector<std::weak_ptr<Edge>>或std::vector<std::shared_ptr<Edge>>(取决于边缘是否自己的节点,反之亦然)
- 能够将Node和Edge对象存储在标准C++容器中
没问题,只需确保您的类型可以安全地移动/复制而不会泄漏或损坏内存,即具有正确的复制/移动构造函数和赋值运算符.如果您使用智能指针并std::vector如上所述,这将自动发生.