2012-03-12 111 views
0

我想构建一个基于回调的串行RX驱动程序,并得到一个编译错误,尽管事实上,我使用了一个已知的结构,并在其他测试应用。我确信我在做一些愚蠢的事情,但是对于我来说,我看不到它,所以多加几双眼睛就会非常感激。传递派生类的指针回调

设备应具有如下功能:

  1. 在建设,通过在通讯科性
  2. 对于同步通信,不创建一个新的线程,只是TX模块。
  3. 用于接收数据,产生一个新的线程,并执行用户在RX上传入的回调。

要实现这一点,我有一个基地回调类如下:

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

和设备类本身内开始非同步接收方法:

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。当我尝试实际开始传递回调指针在主显示的编译错误:

void main(void) 
{ 
    DeviceClass MyDevice(); 
    MyDevice.Initialise(*settings from file*); 

    DemoCallbackClass MyDemoCallback(); 

    MyDevice.StartAsynchRX(&MyDemoCallback); // ERROR ON THIS LINE 
} 

1> ...... \ SRC \支持\ AR2500调试\ Main.cpp的(99):错误C2664: 'ocular :: DeviceClass :: StartAsynchRX':无法将参数1从'DemoCallbackClass(__cdecl *)(void)'转换为'ocular :: DeviceCallback *'

我确信我在这里做了一些愚蠢的事情,但我无法为我的生活找到它。上周我用完全相同的方法编写了一个事件计时器类,它工作得很好。如果结构/方法对所有人都可以,那我想这是一个微妙的错字,我只需要一次重写一个块,直到我摆脱那个该死的错误。

此致在desparation,

DKW

+0

[为什么使用一组空括号来调用没有参数的构造函数时出错?](http://stackoverflow.com/questions/180172/why-is-it-an-error - 使用空集括号 - 呼叫 - 构造函数与否) – 2012-03-12 00:21:20

回答

0

从该行中删除括号:

DemoCallbackClass MyDemoCallback(); 

所以它看起来像这样:

DemoCallbackClass MyDemoCallback; 

错误输出是无益在这种情况下,但应该解决它。

+1

哦...我的...上帝... :) :) 我觉得像这样一个该死的布偶!非常感谢。我担心我发现了一些我认为是标准方法的更加可怕的扩展性缺陷。(这意味着其他应用程序使用我的实现相同的方法有一个潜在的错误,因此担心) – OcularProgrammer 2012-03-12 00:36:00

相关问题