【问题标题】:c++ aggregation relationship creationc++聚合关系创建
【发布时间】:2016-03-28 21:28:27
【问题描述】:

我有以下代码:

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)关系必须产生聚合关系,但它产生了关联关系。如何建立聚合关系?

【问题讨论】:

  • 2 条建议: 1. 使用智能指针,特别是避免在 STL 容器中使用裸指针。 2. 选择正确的智能指针来传达关系的性质,例如unique_ptr 清楚地显示所有权。

标签: c++ uml reverse-engineering


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 我将原始指针转换为 unique_ptr 但在这种情况下 bouml 没有生成类图。也许它与 c++11 不兼容。
【解决方案2】:

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

Bouml 自 2012 年 4 月 26 日发布 5.1 起管理 C++11

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 1970-01-01
    • 2021-09-14
    • 2020-09-02
    相关资源
    最近更新 更多