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
我有以下代码:
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