用C ++实现事件

时间:2011-06-01 23:48:55

标签: c++ events

在对互联网进行一些研究以获得在C ++中实现事件的有效方法后,我发现了以下方法

  • 接口类 - 应用程序可以覆盖派生类中的虚函数
  • 使用函数指针的正常回调机制
  • 使用Boost.function的代表
  • 信号和插槽(在Qt中使用)

我对这些中的每一个的优点和缺点以及何时使用其中的任何一个感到困惑。 哪种方法最好,为什么? 还有其他解决方案比列出的更好吗?

4 个答案:

答案 0 :(得分:8)

FWIW,我的投票将是Boost Signals任何一天。

Boost确保可移植性。当然,它可以很好地与提升Asio,功能,绑定等

更新

  

Signals2

     

本文档描述了原始Boost.Signals库的线程安全变体。对支持线程安全的接口进行了一些更改,主要是关于自动连接管理。 [....]

Boost确保可移植性。当然,它可以很好地与提升Asio,功能,绑定等

boost :: signals2 :: signal sig;

sig.connect(&print_sum);
sig.connect(&print_product);
sig.connect(&print_difference);
sig.connect(&print_quotient);

sig(5., 3.);

该程序将打印出以下内容:

The sum is 8
The product is 15
The difference is 2
The quotient is 1.66667

示例操作:

void print_sum(float x, float y)
{
  std::cout << "The sum is " << x+y << std::endl;
}

void print_product(float x, float y)
{
  std::cout << "The product is " << x*y << std::endl;
}

void print_difference(float x, float y)
{
  std::cout << "The difference is " << x-y << std::endl;
}

void print_quotient(float x, float y)
{
  std::cout << "The quotient is " << x/y << std::endl;
}

答案 1 :(得分:1)

您检查了GBL library吗?它具有您可能需要(甚至可能更多)甚至驱动设计的所有设施。您可以使用它构建(实际)定时和非定时模型。它是纯C ++,没有受到宏的污染。它还利用C ++ 0x来提高性能。此外,如果您使用C ++ 0x编译器,您将获得lambda函数作为事件处理程序 - 它非常强大。 GBL支持同步和异步事件处理程序,线程和光纤。它通过信号和端口抽象事件流。通过一些独创性和精心设计,您可以使用异步事件处理程序,并显着提高多核/多处理器系统的性能。它还有一个图形设计器和跟踪器。

如果没有可视化,构建和维护事件驱动的应用程序可能非常困难,设计师可以帮助解决这个问题。调试事件驱动的应用程序也非常困难,因为您不再需要顺序执行,而是执行从一个事件处理程序跳转到另一个事件处理程序,因此使用事件跟踪器有很大帮助。

答案 2 :(得分:0)

前两个选项是基本C ++标准的一部分,函数回调也与C代码兼容。

其他两个选项分别需要使用boost和Qt。

优点/缺点是一个太宽泛的问题,答案很大程度上取决于你在做什么,在什么环境和目的。

答案 3 :(得分:0)

您可以使用Observer设计模式。这是一个C ++示例源代码。 http://sourcemaking.com/design_patterns/observer/cpp/3