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

标签 c++ oop smart-pointers composition

我想做的事的一个小例子。

我有一个(堆栈分配的)顶点列表

class Vertex {

    int id;
    double x;
    double y;
    double z;
};

并想创建一个边列表

class Edge {

    int id;
    Vertex * source;
    Vertex * target;
};

有两个指向其源顶点和目标顶点的指针。

通常我会在这里寻找引用,但我希望能够在运行时更改源或目标顶点,所以我需要某种指针类型。

所以我的问题是:是否有一个智能指针在这里很有用,还是我应该像上面那样使用普通指针?

编辑

解决答案中提到的一些要点:

首先,列表应该拥有顶点,这就是它们在堆栈上的原因。

其次,这些 ID 用于其他程序。

它需要一个文件,其中包含所有顶点及其坐标的列表,以及所有边的列表及其两个顶点的 ID。

第三,我需要某种指针,因为顶点的 ID 在运行时会发生变化,并且边的源顶点和目标顶点可能会变为。

(除其他外,执行某种切割和切片)

最佳答案

什么是组合


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

根据这个描述,composition并不是我们想要实现的——看第二部分。

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

class Edge {

    int id;
    Vertex source;
    Vertex target;
};

这种方法在内存使用方面是最好的(一个内存块用于整个对象以及复合对象)并且可能也是效率。当您需要组合时 - 选择此解决方案。

为什么 Composition 不适合这个问题


组合意味着一些后果:

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

在您的数据模型中,您有单独的:

  • 顶点数组(独立),
  • 边数组。

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

然后您希望每条边引用 N 个顶点。

边缘不拥有它们 - 它只引用它们。因此,组合和智能指针(旨在引入某种所有权关联)都不是您想要的,因为设计表明顶点属于顶点数组,而不是边.

所以选择一个简单的指针。

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

关于c++ - 使用原始指针或智能指针在 C++ 中组合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4417191/

相关文章:

c# - 新程序员的 OOP 实现问题

c++ - 必须调用第一个设计模式

c++ - 获取指向类型的boost shared_ptr

c++ - 从原始指针转换为智能指针

c++ - 在 C++ 中部署文本文件

C++ 字符串 : UTF-8 or 16-bit encoding?

python - super(ClassName,self).__init__() 有什么用

c++ - Kurento 自定义插件 : How to send events to java server asynchronously

c++ - QT : How to determine if the event processor is busy

C++11:用 std::shared_ptr() 替换所有非拥有的原始指针?