c++ - 如何让对象相互通信?

标签 c++ oop

在过去的几周里,我一直在想一种方法,让相当不相关的对象能够相互通信。虽然我已经找到了几种方法来实现它,但它们似乎都有些不够优雅或过于复杂。

其中一个可行的解决方案是创建某种父类(super class),它充当“中介”的角色,检查其成员对象的状态并做出相应的响应。

struct SuperClass {
    Car playerCar;
    Police police;

    void update() { if(playerCar.exceedsSpeed()) { police.call(); } }
};

虽然这在简单的程序中可以很好地工作,但这种设计往往会因复杂性而变得困惑。随着创建更多不同的对象类型,需要更多的父类(super class)或中间父类(super class)。最终你会得到一个非常难以维护的严格的类层次结构。

另一种解决方案是将对象的引用作为参数传递。

struct Car {
    Police* pPolice;
    Car(Police* obj) { pPolice = obj; }
};

Police police;
Car playerCar(&police);

Police::call() 的每次调用都可以通过 pPolice 进行,但此解决方案存在两个问题。

首先,Car 结构现在没有任何意义。如果每辆车都有各种特征,例如colormanufacturermaxSpeed 等等,为什么每辆车都有一个警察?由于对象是包含特定于该对象类型的变量的结构,因此在这些变量中包含一个完全不相关的变量会破坏 OOP 的美感。

其次,如果 Car 需要调用更多对象的方法而不仅仅是 police.call(),我现在需要将更多引用作为参数传递。

Car playerCar(&police, &anotherObj, &yetAnotherObj...)

...这很愚蠢。

相反,我希望能够在本地调用适当的方法。

void Car::accelerate() {
    speed++;
    if (speed > maxSpeed) { Mediator::callPolice(); }
};

我该怎么做?那可能吗?这是正确的方法吗?

最佳答案

似乎您通常有两种情况。

一个是警察抓到有人超速行驶。他们不会调用警察报告自己——相反,一名警察有一些他可以观察的区域,如果汽车在通过该区域时超过限制(并且警察没有其他任务) , 他被抓了并被开罚单(或其他什么)。

第二,汽车司机决定报警(例如,发生事故)。在这种情况下,有一个类似“中介”的类。具体来说,有一个类代表电话系统,司机(或看到的其他司机)使用他们的电话报警。如果没有人用电话看到这一事件,那么警察可能不会接到电话——或者至少在司机找到有电话的人时可能会有延迟。

关于c++ - 如何让对象相互通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55190863/

相关文章:

c++ - 移动 QMessageBox?

android - 在我的 Android NDK 应用程序中添加 libstagefright

c++ - 从可变参数推导迭代器类别

c++ - 从 C++ 调用 R 函数

php - 在 PHP 中为 MVC Controller 合并 INSERT Mysql 查询

c++ - 错误 : binding ‘const double’ to reference of type ‘double&’ discards qualifiers

c++ - C++ 中有没有办法创建 'super private' 变量?

javascript - 如何在 JS 中调用 thunk 来访问子对象属性?

java 。抽象元素列表。如何确定元素类型

python - Python 是否支持文字对象之类的东西?