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