在C ++中实现回调的最佳方法是什么

时间:2014-08-22 18:02:01

标签: c++ design-patterns delegates

我有兴趣了解其他人如何设计他们的软件。我在不同的项目中使用了不同的解决方案,但我觉得我可以做得更好。我的实现涉及委托和观察者的使用,但今天我无法抗拒问你如何写它。

我们假设我们有以下内容:

class Sensor
{
  ...
  public:
    void sensorTriggered();
};

Class Device
{
  ...

  public:
    void notifyChangesFromHardware(unsigned int inNotificationInfo);

  protected:
    Sensor *fireAlarm_;
};

int main()
{
  Device someDevice;
  return 0;
}

如果你想调用“Device :: notifyChangesFromHardware”,你会如何设计它? 来自Sensor对象(fireAlarm_)?

谢谢

2 个答案:

答案 0 :(得分:0)

我会像Piotr S.建议的那样看看Boost Signals。另外,我使用的一个简单模式在你的情况下看起来像这样:

template<class NotifyDelegate>
class Sensor
{
  ...
  public:
    // assumes you only have one notify delegate
    Sensor( NotifyDelegate &nd ) : nd_(nd)
    {
    }

    void sensorTriggered()
    {
        unsigned int notifyInfo = 99;
        nd_.notifyChangesFromHardware( notifyInfo );
    }



  private:
    NotifyDelegate &nd_;
};



Class Device
{
  ...

  public:
    void notifyChangesFromHardware(unsigned int inNotificationInfo);

};

int main()
{
  Device someDevice;
  Sensor<Device> someSensor(someDevice);
  someSensor.sensorTriggered();

  return 0;
}

同时查看Observer Pattern

答案 1 :(得分:0)

我会使用函数指针或函数对象:

struct Notifier_Base
{
  virtual void notify(void) = 0;
};

class Sensor
{
  std::vector<Notifier_Base *> notifiers;
  void publish(void)
  {
    std::vector<Notifier_Base *>::iterator iter;
    for (iter =  notifiers.begin();
         iter != notifiers.end();
         ++iter)
    {
      (*iter)->notify();
    }
};

请参阅设计模式:发布者/消费者,发布者/订阅者。