【问题标题】:Event handling between objects of different classes不同类对象之间的事件处理
【发布时间】:2016-03-29 09:28:38
【问题描述】:

我有一个从微控制器上的 CAN 接口捕获帧的 C++ A 类。我正在尝试实现另一个 B 类(以及 C 和 D..),它使用 A 类捕获的帧,一个接一个。实质上,A类根据帧的内容将捕获的帧从上层重定向到其中一个类。我是否应该实现某种事件处理机制(对于编程新手来说我不太熟悉),以便每次接收到一帧时,都会从上层向类的对象触发一个事件?或者我可以通过从 A 类继承 B、C、... 类等来实现这一点。有人可以帮助我如何在这里开发一个良好而简单的逻辑吗?

编辑:一个不太好的方法是我在 A 类中有一个 switch 语句,然后根据案例值调用 B、C、D 类之一的所谓过程方法.但是,这不是一个聪明的方法,因为现在 A 类使用 B、C、D 等类,这是我不想要的。 A 类不应该知道 B、C、D 类……

【问题讨论】:

  • 我可能会为每个处理器定义一个通用接口(基类),它会声明一个“工作/进程”函数。我会将它们全部存储在一个容器中。我将有一个“控制器”类,它将使用类 A 来获取框架并将其传递给每个列表控制器。现在,如何生成控制器列表取决于您,这取决于顺序是否重要等...
  • 我进行了编辑。你能再看看吗?
  • 我明白了,你的意思是只有 B、C 或 D 类中的一个可以处理框架。您可以通过其中一个字段值知道哪个。这是工厂设计模式的一个非常常见的用法,在 google 上查找。如果您不知道哪个,那么您可以使用不太常见的责任链模式,但如果您愿意,我可以为此编写一些伪代码。
  • 如果你能写一个伪代码,那将非常有帮助。
  • 当然,但是哪个版本?你能通过查看框架来判断哪个类可以处理它吗?还是在尝试之前无法判断?

标签: c++ oop event-handling can-bus


【解决方案1】:

例如:类 A 包含 std::list<B*>,其中 B 是带有一些 virtual 处理程序方法的基类。几个类(C、D、E)继承类 B 并重载此方法。然后,您只需通过指针将派生类的实例添加到 A 中的列表(例如:std::list<B*> workers {new C, new D, new E};),并为每个实例调用重载方法。每个类自己决定是否接受当前帧并以自己的方式处理它。

【讨论】:

    【解决方案2】:

    您可以查看Observer design pattern。基本上,您可以拥有一个可观察的类(在您的情况下为 class A)和多个观察者(在您的情况下为 class B class C 等)。观察者将自己注册到可观察的类以进行事件通知。我有一个示例代码EventInterface Model,它允许对象之间的 Qt 样式连接。应用程序需要做的就是将可观察对象的事件与观察者对象的事件处理程序连接起来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-09
      • 1970-01-01
      • 2012-12-10
      • 2021-08-24
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      相关资源
      最近更新 更多