c++ - 管理类的聚合/组合成员之间的关系

标签 c++ relationship aggregation composition

我正在使用聚合和组合创建用于模拟的实体。

在以下 C++ 示例中:

class CCar
{
    CCar( CDriver* pDriver )
    { m_pDriver = pDriver; }

    CDriver* m_pDriver;

    CEngine m_Engine;

    CDriverControls m_Controls;
};

在上面的例子中,一辆汽车由一个发动机和一组驾驶控制装置(按组合)组成。汽车还必须有驾驶员(通过聚合)。

但这仅解释了层次关系 - 驾驶员属于汽车,发动机和控件也属于汽车。但这些成员也彼此相关 - 驾驶员必须对控件执行操作,控件必须对发动机执行操作。这些关系还可以在多个方向发挥作用 - 发动机可能熄火并导致控制装置失灵,或者控制装置可能会疯狂旋转并伤害驾驶员?如果驾驶员不喜欢发动机的声音并离开汽车怎么办?这些关系如何运作?

我正在组合来自许多不同对象的许多不同实体,这些对象经常与其他对象交互,并且对如何以设计的方式管理这些关系感兴趣。

谢谢!

编辑:

正如答复所建议的,管理此问题的一种方法是将汽车指向驾驶员,并向驾驶员提供指向汽车的指针,等等。这是有道理的,可以解决这个特定的示例。然而,从设计的角度来看,这增加了驾驶员的责任,该对象的任务是跟踪它属于哪辆车,但这肯定是容器的职责来跟踪哪些对象属于一起?同样,让 CCar 负责管理这些关系也会将 CCar 变成一个 blob。是否有设计好的解决方案来处理此类关系?

最佳答案

您将它们构建到每个类的方法中。您所描述的是每个类(class)的行为。您的要求表明这种关系也是双向的。您的 Controls 类将具有采用 Engine 参数并调用其方法的方法。发动机将对其转速、马力、扭矩等进行限制,由 Controller 操纵,这些 Controller 将内置限制(例如,“如果您的转速降得太低,就会失速”)。

这不仅仅是构图。您将行为和规则构建到方法中。这些方法可能采用表达您需要的参数。

关于c++ - 管理类的聚合/组合成员之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/932435/

相关文章:

c++ - 反序列化构造函数层次结构

c++ - 如果满足条件,如何消除 vector 中的元素

c++ - 为什么我不能像使用 std::string::size_type 那样使用 QList::size_type? (模板参数错误)

c++ - C++初始化列表,类中的类(聚合)

node.js - 如何计算mongoDB中唯一数据的数量

c# - 根据程序内存查找新地址

swift - 如何与核心数据建立多对多关系? swift ,xcode

ios - 将大型数据集导入核心数据,在 Swift 中建立关系

Laravel 保存/更新多对多关系

c# - 没有参数的聚合关系