确定类 KLM 和 ABC 之间的 UML 关系类型

问题描述

ABC 类和 KLM 类应该是什么关系?是否应该是组合、聚合或关联或任何其他关系。

#include<iostream>
using namespace std;
class ABC
{
    int x;
public:
    ABC() { cout<<"1\t"; }
    ~ABC() { cout<<"2\t"; }
};
class KLM
{
    int  y;
    ABC *O1;
public:
    KLM() { cout<<"3\t"; }
    ~KLM() { cout<<"4\t"; }
};
int main()
{
    KLM *O4=new KLM();
    ABC a1;
    delete(O4);

    return 0;
}

解决方法

是的,至少有一个关联:

  • ABC 中的 KLM 指针表明 KLM 的实例和 ABC 的实例之间可以存在链接。此外,该关联可从 KLM 导航到 ABC
  • 在关联的 0..1 端,多重性是 ABC,因为指针最多可以指向一个对象。然而,我们可以假设它可能是 nullptr,即不指向任何对象。

现在代码中有一个问题:指针KLM::O1没有初始化。如果您没有在构造函数中显式地为其赋值,则应确保它是 nullptr

我们无法了解更多关于这个关系的信息,因为我们不知道这个指针是如何分配给指向 ABC 对象的,例如:

  • 两个不同的 KLM 对象能否指向同一个 ABC?这将排除组合。
  • KLM 对象本身是否会创建 ABC 对象并防止其地址被泄露?在这种情况下,我们可以怀疑是 UML 组合。

提示 1:您有一个带有指针成员的类。您应该实现 rule of 3(或 5)以避免令人讨厌的内存管理错误。如果你展示了规则的实现,我们可以更确定地判断是否组合。

提示 2:您使用 c++11 标签。在现代 C++ 中,智能指针的使用优于原始指针。特别是,unique_ptr 暗示了典型的组合专有所有权。 shared_ptr 表示与聚合非常常见的共享所有权(但我们不能排除简单的关联)。 weak_ptr 表示没有所有权,因此必然是简单的关联。

备注:代码和模型之间没有一对一的关系。相同的代码可用于实现不同的模型。并且同一个模型可以用不同的代码实现。设计意图并不总是包含在代码片段中。因此,更多的是关于或多或少强烈地建议或排除某些可能性,而不是找到一个独特的现实。