我无法理解这些功能是如何不同的

时间:2015-02-17 14:50:20

标签: c++

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

3 个答案:

答案 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;  
}