c++聚合关系创建

c++ aggregation relationship creation

本文关键字:创建 聚合关系 c++      更新时间:2023-10-16

我有以下代码:

class D;
class E;
#include "B.h"
#include "C.h"
#include "F.h"
#include "G.h"
#include <vector>
class A: public G {
    B  b;
    std::vector<C>  cs;
    D* d;
    std::vector<E*> es;
    std::vector<F*> fs;
public:
    A() { fs.push_back(new F); fs.push_back(new F); }
};
int main() {}

在Bouml中,我从以下代码生成了类图:

图表

我想(https://softwareengineering.stackexchange.com/questions/255973/c-association-aggregation-and-composition)A和F之间的关系必须产生聚合关系,但它产生了关联关系。如何建立聚合关系?

这就是您链接的页面描述关联和聚合的方式:

关联:Foo有一个指向Bar对象的指针作为数据成员,而不管理Bar对象->Foo知道Bar

聚合:Foo有一个指向Bar对象的指针,并管理该对象的生存期->Foo包含一个Bar,但没有它也可以存在。

因此,它们的区别在于,在聚合的情况下,A(在您的情况下)管理指向对象的生存期。当前,A不管理F对象的生存期。因此,这种关系确实是联想。这种关系显然与E型完全相同。

如果A的析构函数将销毁所有指向的对象,那么A将管理对象的生存期,并且根据给定的定义,映射将被视为聚合。

我没有使用Bouml的经验,但我非常怀疑它是否能够弄清楚析构函数的作用。我的猜测是,它根据成员的类型以及对现有标准类的了解来推导关系图。指针类型并不表示所有权,因此仅根据类型不可能区分关联和聚合。

然而,std::unique_ptr确实清楚地表明了所有权。如果向量包含它们,那么聚合关系可以从类型中简单地推导出来。由于我没有使用Bouml的经验,我不知道它是否可以进行这样的推导。

反向很难区分关联和聚合。在Bouml中,当一个类型被指针引用时,C++反向总是产生关联,即使是通过模板(d、es和sf的情况),或者是组合(b和cs的情况)

Bouml自2012年4月26日发布的5.1版以来管理C++11