【发布时间】:2008-09-16 22:34:20
【问题描述】:
是否可以在 C++ 中创建自定义事件?例如,假设我有变量 X 和变量 Y。每当 X 发生变化时,我想执行一个将 Y 设置为 3X 的函数。有没有办法创建这样的触发器/事件? (触发器在某些数据库中很常见)
【问题讨论】:
标签: c++ design-patterns
是否可以在 C++ 中创建自定义事件?例如,假设我有变量 X 和变量 Y。每当 X 发生变化时,我想执行一个将 Y 设置为 3X 的函数。有没有办法创建这样的触发器/事件? (触发器在某些数据库中很常见)
【问题讨论】:
标签: c++ design-patterns
这基本上是观察者模式的一个实例(正如其他人提到并链接的那样)。但是,您可以使用模板魔法使其在语法上更具可调色性。考虑类似...
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 signals 是您在执行观察者模式(又名发布-订阅)时可能遇到的另一个常用库。买家要注意了,听说性能很差。
【讨论】:
【讨论】:
据我所知,你不能使用默认变量来做到这一点,但是如果你编写了一个带有回调函数的类,你可以让其他类注册他们希望收到任何更改的通知。
【讨论】:
认为您应该阅读一些关于 Design Patterns 的内容,特别是 Observer Pattern。
来自Trolltech 的 Qt 实现了一个很好的解决方案,他们称之为Signals and Slots。
【讨论】: