这个问题介于理论和实践之间。
我有一个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.
}
这很有效。但是,我正在寻找一种写这条线的方法:
myStruct.FileAcb= FileB::Callback;
允许我的FileB :: Callback函数不是静态的。有没有办法实现这个目标?
答案 0 :(得分: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);
}
即使在非OO风格的C中,为回调函数提供这种参数也是传统的,因此它们可以保留任何可能需要的状态。
类似C ++的方法是使用std::function<void(MyEvent,uint8_t)>
而不是原始指针。