我不明白这些功能有何不同

I can't understand how these functions are different

本文关键字:功能 何不同 明白      更新时间:2023-10-16

我有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){}

不同之处在于,类的成员函数有一个隐式的第一个参数this,该参数指向调用该函数的类的实例。因此,两个函数之间的区别在于,独立函数采用两个参数,而成员函数采用三个参数。

为了解决这个问题,您需要使用std::bind将回调绑定到您希望调用它的EventManager实例。或者,您可以将回调函数设置为静态。

类内的函数需要一个指向函数调用对象的this指针。因此,签名由传递的额外T*(在您的情况下为EventManager*)扩展。签名不匹配。

您可以使用static函数告诉编译器此函数不在特定实例上操作。您不会得到this指针,您的代码应该可以工作。如果确实需要访问实例指针,请查看std::bind

您还可以使用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;  
}