【问题标题】:Custom events in C++?C++ 中的自定义事件?
【发布时间】:2008-09-16 22:34:20
【问题描述】:

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

【问题讨论】:

    标签: c++ design-patterns


    【解决方案1】:

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

    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,并且一直对结果感到满意。
    【解决方案2】:

    Boost signals 是您在执行观察者模式(又名发布-订阅)时可能遇到的另一个常用库。买家要注意了,听说性能很差。

    【讨论】:

      【解决方案3】:

      使用观察者模式

      code project example

      wiki page

      【讨论】:

        【解决方案4】:

        据我所知,你不能使用默认变量来做到这一点,但是如果你编写了一个带有回调函数的类,你可以让其他类注册他们希望收到任何更改的通知。

        【讨论】:

          【解决方案5】:

          认为您应该阅读一些关于 Design Patterns 的内容,特别是 Observer Pattern

          来自Trolltech 的 Qt 实现了一个很好的解决方案,他们称之为Signals and Slots

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-03-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多