如何在UML中表示相互引用的两个类?

如何在UML中表示相互引用的两个类?,uml,Uml,我试图用UML图来表示我的程序。我有两门课,如下所示: Mesh.h class Mesh { public: Mesh(); ~Mesh(); VertexArrayObject* vao; }; class VertexArrayObject { public: VertexArrayObject(Mesh* mesh); ~VertexArrayObject(); Mesh* mesh; }; VertexArrayObject.h cl

我试图用UML图来表示我的程序。我有两门课,如下所示:

Mesh.h

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

class Mesh
{
public:
    Mesh();
    ~Mesh();
    VertexArrayObject* vao;
};
class VertexArrayObject
{
public:
    VertexArrayObject(Mesh* mesh);
    ~VertexArrayObject();
    Mesh* mesh;
};
我想画成这样:


然而,这看起来根本不对。在两个类都使用UML相互引用的情况下,如何最好地表示一种关系?

不,这是完全错误的。复合聚合只能在一侧。(想象一下汽车/车轮的例子:每一个聚集另一个是胡说八道。)去掉钻石,你就完成了

你们可以更进一步,用点代替钻石。这意味着双方都有引用另一方类的属性。看


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

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

鉴于我对3D的理解(很差)(我想这就是你的程序的内容),我会假设网格包含一组垂直,因此合成将从顶点类型运行到网格类型,网格端有实心菱形。你也可能想要增加多重性(这样显而易见的是,在网格中可能存在多个顶点),并且还考虑该关系是复合的还是共享的聚合(顶点是否存在于网格之外?如果是这样,需要共享的集合(白色菱形))。 您可能不需要表示从网格到顶点的关系,因为这是一个可以在UML中安全抽象的实现细节。使用指向数组的指针可能与网格由多个顶点组成的逻辑无关

这就是说,如果您确实希望精确地指定代码中的内容,那么这可以在UML中完成。我建议从Vertex中抽象出顶点数组-代码中有三种逻辑类型-网格、顶点和VertexArray。您可以演示网格与VertexArray的基本关联(使用箭头标识参照方向),而这反过来又由顶点(VertexArray末端的黑色菱形)组成


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

正如@ThomasKilian所说,您的UML模型是不正确的。请发布
Mesh
VertexArrayObject
的完整API(仅方法声明)。我认为它们对区分联想和构图很重要。例如,在
Mesh
类中,如果没有任何方法将实例放入
vao
,则可以将其合并。