用原始或智能指针在c ++中组合?

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在运行时会发生变化,而边缘的源和目标顶点可能会变为.

(其中包括进行某种切割和切片)

Kos*_*Kos 7

是什么组成


组合(以UML术语)是当给定对象是另一个对象的"一部分"时的关联 - 即它具有相同的生命周期 - 并且 - 最重要和特征 - 本身不存在/有意义.

根据这个描述,构图不是我们想要达到的 - 见第二部分.

在C或C++中,实现组合的最佳方法是不使用任何指针:

class Edge {

    int id;
    Vertex source;
    Vertex target;
};
Run Code Online (Sandbox Code Playgroud)

这种方法在内存使用方面是最好的(整个对象的一个​​内存块以及复合对象),也可能是效率.当你需要合成时 - 去寻找这个解决方案.

为什么Composition不适合这个问题


构图意味着一些结果:

  • 组合对象本身不存在,
  • 它们与复合对象的关联在该对象的生命周期中是永久的.

在您的数据模型中,您有以下内容:

  • 顶点数组(独立),
  • 边缘数组.

两者都可能是堆栈分配的(但这并不重要).

然后,您希望每个边引用 N个顶点.

边缘不拥有它们 - 它只涉及它们.因此,无论是组合还是智能指针(设计用于引入某种所有权关联)都不是您想要的,因为设计说顶点由顶点数组拥有,而不是由边缘所有.

所以去寻找一个普通的指针.

您甚至可以使用数组索引而不是指针作为替代(确实有其用途,例如,如果您想将后一个数组用作3D渲染的索引缓冲区).一切都取决于您的需求.

  • 然后你不想复制你的顶点.然后,它不再是组合 - 它只是关联,所以这里没有严格的所有权. (2认同)
  • @Randooom,这是真的,但是 - 就OOP而言 - 组合可以被描述为"是 - 部分"关系.在这种情况下,顶点不是"边缘的一部分",因此边(边对象)不是"由"顶点组成.最后一部分听起来可能违反直觉,但请记住,我们现在指的是*数据模型*.在此上下文中,顶点对象是顶点数组的"部分"而不是边缘对象. (2认同)