使用成员函数的回调

时间:2017-09-25 13:25:09

标签: c++ object callback

编辑:( 9月26日)

对于touchScreen校准工具,我有一个MT_Interface类,它有一个成员函数 Send_Touch_Event 。每次调用此函数时,我想从另一个类(Calibration_checker)运行一个名为“EventWrite”的回调函数。

在代码中,这些是感兴趣的以下函数(我想,我没有制作MT_Interface)。

class MT_Interface 
{
          void SetCallback( void (*cb)(MT_Interface_TouchEvent_Type), void* o ) {Callback_fct = cb; Callback_obj = o;};
          void Send_Touch_Event(MT_Interface_Message_Type Message, int ID, int X, int Y, int Additional_Info1, int Additional_Info2);
          {
            // Does something and than uses the callback
               (*Callback_fct)(touch_event, Callback_obj);
          };
}

具有EventWrite功能的类可以概括为:

class Calibration_checker 
{

    MT_Interface *MT_Interface_object  

    EventWrite(MT_Interface_TouchEvent_Type t, void* o)

    Configure()
    {
     // Configure the MT_Interface_object & set callback    
     MT_Interface_object->SetCallback(&Calibration_checker::EventWrite, (void*)this);
     }
}

我认为这里将使用SetCallBack函数,但我无法使其工作。我不太明白我得到的错误信息。也许这里有人可以解决这个问题?

当我应用下面提出的包装函数时,遗憾的是我得到了类似的错误。

Calibration_checker.cxx: In member function ‘void Calibration_checker::Configure()’:
Calibration_checker.cxx:83:81: error: no matching function for call to ‘MT_Interface::SetCallback(void (Calibration_checker::*)(MT_Interface_TouchEvent_Type, void*), void*)’
   MT_Interface_object->SetCallback(&Calibration_checker::EventWrite, (void*)this);
                                                                                 ^
In file included from Calibration_checker.hxx:4:0,
                 from Calibration_checker.cxx:4:
MT_Interface.hxx:163:12: note: candidate: void MT_Interface::SetCallback(void (*)(MT_Interface_TouchEvent_Type, void*), void*)
       void SetCallback( void (*cb)(MT_Interface_TouchEvent_Type, void*), void* o ) {Callback_fct = cb; Callback_obj = o;};
            ^
MT_Interface.hxx:163:12: note:   no known conversion for argument 1 from ‘void (Calibration_checker::*)(MT_Interface_TouchEvent_Type, void*)’ to ‘void (*)(MT_Interface_TouchEvent_Type, void*)’

1 个答案:

答案 0 :(得分:0)

非静态成员函数不能作为函数指针存在,因为this指针需要以某种方式传递。值得庆幸的是,看起来o参数被传递回回调函数,因此将对象作为第二个参数传递并将包装函数作为第一个参数传递应该可以解决问题。

鉴于此类型:

struct Foo
{
    void EventWrite(MT_Interface_TouchEvent_Type);
};

这个包装函数:

void foo_touch_event_wrapper(MT_Interface_TouchEvent_Type t, void *o)
{
    static_cast<Foo *>(o)->EventWrite(t);
}

在调用回调时仍然存在的一些实例foo,然后我们可以附加处理程序:

someObject.SetCallback(foo_touch_event_wrapper, &foo);