C ++聚合关系创建

c++ aggregation relationship creation

我有以下代码:

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 中,我根据以下代码生成了 class 图:

diagram

本以为A和F之间的(https://softwareengineering.stackexchange.com/questions/255973/c-association-aggregation-and-composition)关系要产生聚合关系,结果产生了关联关系。如何建立聚合关系?

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

Association: Foo has a pointer to Bar object as a data member, without managing the Bar object -> Foo knows about Bar

Aggregation: Foo has a pointer to Bar object and manages the lifetime of that object -> Foo contains a Bar, but can also exist without it.

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

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

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

然而,std::unique_ptr确实明确表示所有权。如果向量包含它们,则可以从类型中轻松推导出聚合关系。由于我没有使用Bouml的经验,我不知道它是否有这样的推导。

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

自 2012 年 4 月 26 日分发的 5.1 以来,Bouml 管理着 C++11