Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+;中实现回调的最佳方法是什么+;_C++_Design Patterns_Delegates - Fatal编程技术网

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

C++ 在C+;中实现回调的最佳方法是什么+;,c++,design-patterns,delegates,C++,Design Patterns,Delegates,我对学习别人如何设计他们的软件感兴趣。我在不同的项目上使用了不同的解决方案,但我觉得我本可以做得更好。我的实现涉及到使用委托和观察者,但今天我忍不住要问您将如何编写它 假设我们有以下几点: class Sensor { ... public: void sensorTriggered(); }; Class Device { ... public: void notifyChangesFromHardware(unsigned int inNotificati

我对学习别人如何设计他们的软件感兴趣。我在不同的项目上使用了不同的解决方案,但我觉得我本可以做得更好。我的实现涉及到使用委托和观察者,但今天我忍不住要问您将如何编写它

假设我们有以下几点:

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

Class Device
{
  ...

  public:
    void notifyChangesFromHardware(unsigned int inNotificationInfo);

  protected:
    Sensor *fireAlarm_;
};

int main()
{
  Device someDevice;
  return 0;
}
如果要调用“Device::notifyChangesFromHardware”,您将如何设计它 从传感器对象(fireAlarm_389;)开始


谢谢你

我会像Piotr S.建议的那样看一下增压信号。另外,在您的案例中,我使用的一个简单模式如下所示:

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;
}
模板
类传感器
{
...
公众:
//假设您只有一个通知委托
传感器(nd和nd):nd(nd)
{
}
空位传感器()
{
unsigned int notifyInfo=99;
从硬件(notifyInfo)更改通知;
}
私人:
通知代表&nd;
};
类设备
{
...
公众:
无效通知来自硬件的更改(未签名的int inNotificationInfo);
};
int main()
{
装置;装置;
传感器someSensor(someDevice);
someSensor.sensortrigged();
返回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();
    }
};
struct Notifier\u Base
{
虚拟作废通知(作废)=0;
};
类传感器
{
std::向量通知程序;
作废发布(作废)
{
std::vector::iter;
for(iter=notifiers.begin();
iter!=通知程序.end();
++国际热核聚变实验堆(iter)
{
(*iter)->notify();
}
};

查看设计模式:发布者/消费者,发布者/订阅者。

Boost.Signals2:?@PiotrS.是的,我认为这也会起作用!来自Qt的信号和插槽。感谢您的建议。看到其他开发人员如何解决这个问题,特别是来自像您这样经验丰富的高级开发人员,确实很有趣。感谢您的支持了解其他人是如何做到这一点的,这是非常有帮助和有教育意义的,当我的解决方案(我过去的解决方案)与其他开发人员的解决方案相匹配时,这是非常令人鼓舞的。