我有callbackType,如果我定义没有类的函数,但是当我尝试做同样但有一个类时,它只是给我一个转换错误。
·H
typedef void(*NclCallback)(NclEvent event, void* userData);
NclCallback callBack;
的.cpp
void callBackF(NclEvent event, void* userData){}
EventManager::EventManager(){
this->callBack = callBackF; //this works,
this->callBack = callBackFunction; // this doesn't work
this->callBack = this->callBackFunction; // this doesn't work
}
void EventManager::callBackFunction(NclEvent event, void* userData){}
答案 0 :(得分:2)
不同之处在于类的成员函数具有隐式的第一个参数,该参数指向调用该函数的类的实例。因此,两个函数之间的区别在于,独立函数采用两个参数,而成员函数采用三个参数。
要解决此问题,您需要使用std :: bind将回调绑定到您希望在其上调用的EventManager实例。或者,您可以将回调函数设置为静态。
答案 1 :(得分:2)
类中的函数需要一个this
指针,该指针指向调用该函数的对象。因此,签名通过额外的T*
(在您的情况下为EventManager*
)进行扩展。签名不匹配。
您可以使用static
函数告诉编译器此函数不在特定实例上运行。你不会得到一个this
指针,你的代码应该可行。如果确实需要访问实例指针,请查看std::bind
。
答案 2 :(得分:0)
您还可以使用std::function
和lambdas来存储回调:
std::function<void(int, int)> callback;
void f1(int, int) {
cout << "one" << endl;
}
struct f2 {
void operator() (int, int) {
cout << "two" << endl;
}
};
struct f3 {
void member(int, int) {
cout << "three" << endl;
}
};
int main() {
callback = f1;
callback(0,0);
callback = f2{};
callback(0,0);
f3 obj;
callback = [&obj] (int a, int b) { obj.member(a,b); };
callback(0,0);
using namespace std::placeholders;
callback = std::bind(&f3::member, obj, _1, _2);
callback(0,0);
return 0;
}