gpt4 book ai didi

C++聚合关系创建

转载 作者:行者123 更新时间:2023-11-30 02:34:36 28 4
gpt4 key购买 nike

我有以下代码:

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 中,我从这段代码生成了类图:

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 确实明确表示所有权。如果 vector 包含它们,则可以从类型中轻松推导出聚合关系。由于我没有使用 Bouml 的经验,我不知道它是否会进行这样的推导。

关于C++聚合关系创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34418843/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com