我试图用UML图表示我的程序。我有两个课程如下:
Mesh.h
class Mesh
{
public:
Mesh();
~Mesh();
VertexArrayObject* vao;
};
VertexArrayObject.h
class VertexArrayObject
{
public:
VertexArrayObject(Mesh* mesh);
~VertexArrayObject();
Mesh* mesh;
};
我想它会被画成这样:
然而,这看起来并不正确。如何最好地表示两个类使用UML相互引用的关系?
答案 0 :(得分:2)
没有。这是完全错误的。复合聚合只能在一侧。 (想象一下汽车/车轮的例子:每一个聚合另一个都是无稽之谈。)去掉钻石,你就完成了。
你可以更进一步,用点而不是钻石。这意味着双方都有参与另一方课程的属性。请参阅this answer。
答案 1 :(得分:0)
这很大程度上取决于您想要表示的逻辑结构。您可以通过多种方式指定Mesh和Vertex之间的关系并获取消息;我从您发布的模型中了解到,您认为构图可能是这种关系的一个重要方面,例如: Vertex是Mesh的复合部分(反之亦然)。
在UML中你不能真正拥有双向组合,因为这会导致逻辑悖论 - 即。你不能同时拥有两个同时是彼此复合部分的类。如果构图很重要,那么你需要选择哪个由哪个组成。
鉴于我对3D的理解很差(我猜这是你的程序的意思),我会假设Mesh包含一个Verticies集合,因此组合将从Vertex类型运行到Mesh类型与实体网眼末端的钻石。您可能还想添加多重性(这样很明显,Mesh中可能存在多个Vertex)并且还要考虑关系是复合关系还是共享聚合(顶点是否可以存在于网格外?如果是共享聚合(白色)钻石)是需要的。)
您可能不需要表示从Mesh到Vertex的关系,因为这是一个可以在UML中安全地抽象出来的实现细节。您使用指向数组的指针的事实可能与Mesh由许多Vertex组成的逻辑无关。
也就是说,如果您确实希望在代码中精确指定所拥有的内容,那么可以在UML中完成。我建议从顶点抽象出顶点数组 - 你的代码中有三种逻辑类型 - Mesh,Vertex和VertexArray。您可以说明Mesh与VertexArray具有基本关联(带有箭头以标识参考方向),而这又由Vertex(VertexArray端的黑色菱形)组成。
当然,我假设VertexArray代表一个Vertex对象数组,而不是一个顶点!