问题描述
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
表示没有所有权,因此必然是简单的关联。
备注:代码和模型之间没有一对一的关系。相同的代码可用于实现不同的模型。并且同一个模型可以用不同的代码实现。设计意图并不总是包含在代码片段中。因此,更多的是关于或多或少强烈地建议或排除某些可能性,而不是找到一个独特的现实。