传递派生类指针以进行回调

时间:2012-03-12 00:04:22

标签: c++ visual-studio-2010 callback

我正在尝试构建一个基于回调的串行RX驱动程序,尽管我正在使用一个已知良好且在其他应用程序中经过测试的结构,但我收到了编译错误。我确定我做的事情很傻,但对于我的生活,我看不到它,所以额外的一双眼睛会非常感激。

设备应按如下方式运行:

  1. 构建时,传入通信属性
  2. 对于同步通信,请勿创建新线程,只需阻止TX。
  3. 用于接收数据,生成新线程,并执行用户在RX上传入的回调。
  4. 为实现这一点,我有一个基本回调类,如下所示:

    namespace ocular
    {
     Class DeviceCallback
     {
     public:
       DeviceCallback(){}
       ~DeviceCallback(){}
       virtual void DeviceCallbackFunction(unsigned char Data){}
     };
    }
    

    设备类中的Start Asynch RX方法本身为:

    void DeviceClass::StartAsynchRX( DeviceCallback* callback )
    {
      m_externalCallback = callback; // Save a local copy of the callback pointer
      m_started = true;
      StartAsynchRXThread();         // Spawn the RX Thread
      return;
    }
    

    然后我将自己的回调派生为:

    Class DemoCallbackClass : public ocular::DeviceCallback
    {
    public:
      void DeviceCallbackFunction(unsigned char myData){
        std::cout << myData;
      };
    }
    

    据我所知,到目前为止这是正确的教科书。这将编译得很好,我可以构建,配置和使用我的设备类进行同步TX。当我尝试实际开始在main中传递回调指针时出现编译错误:

    void main(void)
    {
      DeviceClass MyDevice();
      MyDevice.Initialise( *settings from file* );
    
      DemoCallbackClass MyDemoCallback();
    
      MyDevice.StartAsynchRX( &MyDemoCallback );  // ERROR ON THIS LINE
    }
    

    1&gt; ...... \ Src \ Support \ AR2500调试\ Main.cpp(99):错误C2664:'ocular :: DeviceClass :: StartAsynchRX':无法从'DemoCallbackClass(__cdecl *)转换参数1 (void)'to'obular :: DeviceCallback *'

    我有理由相信我在这里做了一些愚蠢的事,但我找不到它的生命。上周我使用完全相同的方法编写了一个事件计时器类,它工作得很好。如果结构/方法看起来对每个人都很好,我猜这是一个微妙的错字,我只需要一次重写一个块,直到我摆脱该死的错误。

    你的解散,

    DKW

1 个答案:

答案 0 :(得分:0)

从这一行中删除括号:

DemoCallbackClass MyDemoCallback();

所以它看起来像这样:

DemoCallbackClass MyDemoCallback;

在这种情况下,错误输出完全没有帮助,但是应该修复它。