ran*_*oom 7 c++ oop smart-pointers composition
我想做的一个小例子.
我有一个(堆栈分配)顶点的列表
class Vertex {
int id;
double x;
double y;
double z;
};
Run Code Online (Sandbox Code Playgroud)
并想要创建边缘列表
class Edge {
int id;
Vertex * source;
Vertex * target;
};
Run Code Online (Sandbox Code Playgroud)
两个指向其源和目标顶点的指针.
通常我会在这里找一个参考,但我希望能够在运行时更改源或目标顶点,所以我需要某种指针类型.
所以我的问题是:是否有一个智能指针在这里很有用,或者我应该只使用上面的普通指针?
编辑
解决了答案中出现的一些问题:
首先,列表应该拥有顶点,这就是它们在堆栈中的原因.
其次,ID用于其他程序.
它需要一个文件,其中包含所有顶点及其坐标的列表,以及所有边的列表及其两个顶点的ID.
第三,我需要某种指针,因为顶点的id在运行时会发生变化,而边缘的源和目标顶点可能会变为.
(其中包括进行某种切割和切片)
组合(以UML术语)是当给定对象是另一个对象的"一部分"时的关联 - 即它具有相同的生命周期 - 并且 - 最重要和特征 - 本身不存在/有意义.
根据这个描述,构图不是我们想要达到的 - 见第二部分.
在C或C++中,实现组合的最佳方法是不使用任何指针:
class Edge {
int id;
Vertex source;
Vertex target;
};
Run Code Online (Sandbox Code Playgroud)
这种方法在内存使用方面是最好的(整个对象的一个内存块以及复合对象),也可能是效率.当你需要合成时 - 去寻找这个解决方案.
构图意味着一些结果:
在您的数据模型中,您有以下内容:
两者都可能是堆栈分配的(但这并不重要).
然后,您希望每个边引用 N个顶点.
边缘不拥有它们 - 它只涉及它们.因此,无论是组合还是智能指针(设计用于引入某种所有权关联)都不是您想要的,因为设计说顶点由顶点数组拥有,而不是由边缘所有.
所以去寻找一个普通的指针.
您甚至可以使用数组索引而不是指针作为替代(确实有其用途,例如,如果您想将后一个数组用作3D渲染的索引缓冲区).一切都取决于您的需求.