C ++中的自定义事件?

时间:2020-03-05 18:57:24  来源:igfitidea点击:

是否可以在C ++中创建自定义事件?例如,假设我有变量X和变量Y。每当X更改时,我都想执行一个将Y设置为3X的函数。有没有办法创建这样的触发器/事件? (触发器在某些数据库中很常见)

解决方案

回答

认为我们应该阅读一些有关设计模式的知识,特别是观察者模式。

奇趣科技的Qt已经实现了一个很好的解决方案,称为信号和插槽。

回答

使用观察者模式

代码项目示例

维基页面

回答

据我所知,我们不能使用默认变量来完成此操作,但是,如果我们编写了一个带有回调函数的类,则可以让其他类注册它们想要得到任何更改的通知。

回答

这基本上是观察者模式的一个实例(正如其他人提到并链接的一样)。但是,我们可以使用模板魔术使它在语法上更具可调色性。考虑类似...

template <typename T>
class Observable
{
  T underlying;

public:
  Observable<T>& operator=(const T &rhs) {
   underlying = rhs;
   fireObservers();

   return *this;
  }
  operator T() { return underlying; }

  void addObserver(ObsType obs) { ... }
  void fireObservers() { /* Pass every event handler a const & to this instance /* }
};

那你就可以写...

Observable<int> x;
x.registerObserver(...);

x = 5;
int y = x;

我们使用哪种方法来编写观察者回调函数完全取决于我们自己;我建议使用http://www.boost.org的功能或者功能模块(也可以使用简单的函子)。我还提醒我们注意这种类型的运算符重载。尽管它可以使某些编码样式更清晰,但还是不顾后果地使用诸如

似乎LikeAnIntToMe = 10;

这是一项非常昂贵的操作,很可能会爆炸,并在未来数年内引起调试方面的噩梦。

回答

Boost信号是我们可能会遇到的另一个常用的库,用于执行观察者模式(也称为发布-订阅)。买家请注意,我听说它的性能很差。