9

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

4

5 回答 5

10

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

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;

一个非常昂贵的操作,很可能会爆炸,并导致未来几年的调试噩梦。

于 2008-09-16T22:52:42.140 回答
3

Boost 信号是您在执行观察者模式(又名发布-订阅)时可能遇到的另一个常用库。买家在这里要小心,我听说它的性能很糟糕。

于 2008-09-17T01:13:41.037 回答
1

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

奇趣科技的Qt实现了一个很好的解决方案,他们称之为Signals and Slots

于 2008-09-16T22:36:51.397 回答
1

使用观察者模式

代码项目示例

维基页面

于 2008-09-16T22:37:40.397 回答
1

据我所知,您不能使用默认变量来执行此操作,但是如果您编写了一个采用回调函数的类,您可以让其他类注册它们希望收到任何更改的通知。

于 2008-09-16T22:38:26.043 回答