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中,我从以下代码生成了类图:
图表
我想(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
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 使用std::multimap迭代器创建std::list
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- 使用CMake创建QML插件
- 如何在c++中为模板函数实例创建快捷方式
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 对在不同二进制文件中创建的对象文件的依赖关系
- 为什么在C++中使用关系运算符创建的模板函数不能对字符串正常工作?
- 聚合关系 - 在专用中初始化类,从单独的 .cpp/.h.
- 使用聚合创建和关联两个不同的对象成员
- C++正在创建一个头来解决循环依赖关系,这是一个好主意
- 热到不依赖于与GNU Make的依赖关系的原子创建
- c++聚合关系创建
- 如何从需要外部依赖关系的多个.o文件中创建可执行文件
- 我的聚合、关联和组合关系在这个C++程序中不起作用
- 为具有大量依赖关系的库创建包装器的正确方法
- 类之间的聚合和组合关系
- 用对象创建父/子关系
- 我可以使用QSortFilterProxyModel创建摘要/聚合模型吗