2016-02-02 45 views
0

这个问题介于理论与实践之间。在C++中分配回调函数

我有一个C文件(姑且称之为fileA.c和fileA.h)

fileA.h一个结构的定义是这样的:

typedef struct 
{ 
    /** Callback function which is called upon an event occurrence */ 
    void (*FileAcb)(MyEvent event, uint8 val); 
} MyStruct; 

在fileB.cpp和fileB.h,我正试图像这样给它分配回调函数。

FileB.h

class FileB 
{ 
    public: 
     static void Callback(MyEvent event, uint8 val); 
    protected: 
     /**Protected members */ 
    private: 
     /**Private members */ 
     MyStruct myStruct; 
}; 

FileB.cpp

bool FileB::Start() 
{ 
    myStruct.FileAcb= FileB::Callback; 

    return true; 
} 

void FileB::Callback(MyEvent event, uint8 val) 
{ 
    //do some stuff here. 
} 

而这个工作。不过,我正在寻找一种方式来写这条线:在某种程度上,让我FILEB

myStruct.FileAcb= FileB::Callback; 

::回调函数不被静电。有没有办法实现这一点?

+0

“我有一个C文件(我们称它为fileA.c和fileA.h)” - 根据是否将头文件计为C文件(在“C语言”的意义上),或者使得两个C文件或一个不相关。无论如何,那不是C! – Olaf

+0

@Olaf我想在这种情况下,我给了无关的信息。最终,我关心的是FileA.h中的typedef结构。 –

+0

您是否在网上搜索关于您的问题? ^^ https://www.google.de/search?q=cpp+Callback+function+to+NOT+be+static.&ie=utf-8&oe=utf-8&gws_rd=cr&ei=_MiwVtqYF4fcO6f4s8gM –

回答

1

有没有办法做到这一点?

不直接。 传统的C风格的方式做,这是提供一个void*参数,它指向你的对象,和一点点转发功能:

struct CallbackWithData 
{ 
    void *closure; 
    void (*callback)(void *closure, MyEvent event, uint8 val); 
}; 

void ForwardToFileB(void *closure, MyEvent event, uint8 val) 
{ 
    FileB *target = (FileB *)closure; 
    target->Callback(event, val); 
} 

即使在非面向对象式的C,这是传统的要提供这样一种的回调函数的参数,所以他们有一个地方可以保持他们可能需要的任何状态。

C++类似的方法是使用std::function<void(MyEvent,uint8_t)>而不是原始指针。