如果我有一个class A
,其中包含一个指向class B
的指针,以及一个输入指向class B
class A {
private:
B* attribute;
public:
void method(B* par);
}
如何在UML类图中描述它?我要用*吗?它是什么样的成分?
答案 0 :(得分:17)
在UML中,显示它是否是指针并不重要。为什么?因为,您可能正在使用UML来描述没有指针的语言的OOD。
快速回答:从您的代码中,A聚合B(A类空白钻石,用实线连接B)。那是因为没有析构函数可以删除 A.attribute 指针引用的内容。
真正重要的是说引用对象的生命周期是什么。因此,对于在销毁所有者时死亡的引用对象(具有关系),您必须使用实心(填充)菱形。这称为组合。因此,所有者必须管理所拥有对象的生命周期。一个这样的例子是人类有手。当人类物体被摧毁时,手不能存活。
当钻石未填充(聚合)时,所有者不负责管理所拥有对象的生命周期。例如,您不希望在析构函数中看到所拥有的对象被删除。雇主有一个TeamLeadRole,但当雇主被“摧毁”(即离开公司)时,TeamLeadRole仍然可用。
现在,传统上当你看到一颗填充的钻石时,你通常(并不是所有的时间)都会有一个物体。当你看到空钻石时,你可以使用参考或指针。
如果您的类使用另一个类但不保留该类的实例(或引用/指针),那么您可以通过对象之间的简单线(实线)来表示依赖性。这意味着存在一种称为关联的关系。
答案 1 :(得分:3)
普通的C ++指针直接对应于UML类图中的引用属性,如下图所示:
这样的引用属性表示单向(二进制)关联,如下图所示:
注意关联线B侧的“点”。这意味着名称为“attribute”的关联结束由类A拥有,这意味着它对应于上图中显示的引用属性(关联可以用引用属性替换)。有关详细说明,请参阅此tutorial的第5章。
您不能在UML类图中使用C ++符号“*”,因为
在任何情况下,A类和B类之间的关系都是一种关联。如果您具有聚合组件关系的附加语义,它可能是一个组合。请注意,您的问题应该措辞:“它是什么样的联系?”而不是“它是什么样的组成?”因为组合和聚合是特殊类型的关联。
答案 2 :(得分:2)
有可能区别*,&和UML类图上的[]字段。它被命名为“类型修饰符”。问题是在工具图上显示它。如果你有一个图表工具,只需在最后绘制它作为结尾的刻板印象。但要注意不要将其与多重性混合!如果你有一个建模工具,你将不得不看看如何做到这一点。
但请注意,指针/引用字段应该是默认字段,因此您无需在类图中真正指定您的情况。
如果要以正确的方式显示此信息,请使用更详细的复合结构图。你可以在那里展示这些&,*,[]。
对于类图中不同的关联变体,请查看以下类似问题的答案: https://stackoverflow.com/a/21478862/715269