如何在 UML 中表示 2 类 相互引用?

How to represent 2 classes with references to each other in UML?

我试图在 UML 图中表示我的程序。我有 2 类 如下:

Mesh.h

class Mesh
{
public:
    Mesh();
    ~Mesh();
    VertexArrayObject* vao;
};

VertexArrayObject.h

class VertexArrayObject
{
public:
    VertexArrayObject(Mesh* mesh);
    ~VertexArrayObject();
    Mesh* mesh;
};

我想象它会画成这样:

然而,这看起来根本不对。如何最好地表示 类 使用 UML 相互引用的关系?

没有。那是完全错误的。复合聚合只能在一侧。 (想象一下 car/wheel 示例:每个人都聚集另一个人是无稽之谈。)移除钻石,您就完成了。

你可以走得更远,用圆点代替菱形。这意味着双方都有引用另一方 class 的属性。参见

这在很大程度上取决于您要表示的逻辑结构。您可以通过多种方式指定 Mesh 和 Vertex 之间的关系并传达信息;我从您发布的模型中了解到,您认为构图可能是关系的一个重要方面,例如顶点是网格的复合部分(反之亦然)。

在 UML 中,你不能真正拥有双向组合,因为这会导致逻辑悖论——即您不能同时拥有两个 类,它们同时是彼此的复合部分。如果成分很重要,那么您将需要选择哪个由哪个组成。

考虑到我对 3D 的(贫乏)理解(我想这就是你的程序的目的),我假设网格包含一个顶点集合,因此合成将从顶点类型 运行 到网格末端带有实心菱形的网格类型。您可能还想添加多重性(这样很明显网格内可能存在多个顶点)并且还要考虑关系是复合关系还是共享聚合(顶点可以存在于网格外吗?如果是共享聚合(白色需要钻石)。

您可能不需要表示从网格到顶点的关系,因为这是可以在 UML 中安全抽象的实现细节。您使用指向数组的指针这一事实可能与 Mesh 由许多 Vertex 组成的逻辑无关。

就是说,如果您确实想在代码中精确指定您拥有的内容,那么这可以在 UML 中完成。我建议从 Vertex 中抽象出 Vertex 数组——代码中有三种逻辑类型——Mesh、Vertex 和 VertexArray。您可能会说明 Mesh 与 VertexArray 具有基本关联(使用箭头标识参考方向),而这又由 Vertex(VertexArray 末端的黑色菱形)组成。

当然,我假设 VertexArray 表示 Vertex 对象的数组,而不是单个 Vertex!