本文地址:http://blog.csdn.net/u011465640/article/details/10260459 转载请注明出处。
在C++中有许多方法可以代替掉回调函数,包括虚函数和仿函数等,但需要使用回调的地方还是有很多的。关注到起源于cocos2dx中的回调机制。
因为涉及到类的实例,所以许多需要用的回调的情况都是采用的静态成员函数。例如:
ClassA为回调函数所在的类,回调函数staticCallBackFun为一个静态成员函数。
class ClassA
{
public:
ClassA()
{
}
~ClassA()
{
}
void static staticCallBackFun(int a)
{
std::cout<<"this is a static member function a = "<<a<<"\n";
}
};
classB内调用staticCallBackFun。
class ClassB
{
public:
ClassB()
{
}
~ClassB()
{
}
void onMessage()
{
ClassA::staticCallBackFun(1);
}
};
调用结果如下:
在classB中的onMessage中我们调用了classA的staticCallBackFun.
这是最简单的在C++使用回调方式。但是我们有时候需要调用的是成员函数。因为我们可能需要处理成员变量等问题。
在lipperman的《inside c++ object model》中的第4章 The Semantics of Function 中有提到指向成员函数的指针。根据里面的方法可以这样写
class ClassA
{
public:
ClassA()
{
}
~ClassA()
{
}
void callBackFun(int a){std::cout<<"this is a nonstatic member function , a ="<<a<<"\n";}
};
另外我们再typedef一个函数指针
typedef void(ClassA::*callFUn)(int);
在ClassB中使用方法如下:
class ClassB
{
public:
ClassB()
: target(NULL)
, fun(NULL)
{
}
~ClassB()
{
}
void registerCallBackFun(ClassA *obj,callFUn func)
{
target = obj;
fun = func;
}
void onMessage()
{
if(!target||!fun)
return;
(target->*fun)(0);
}
private:
ClassA *target;
callFUn fun;
};
在使用时先使用注册函数进行注册。如下:
int main(int argc, const char * argv[])
{
ClassA *a = new ClassA();
ClassB *b = new ClassB();
b->registerCallBackFun(a, (&ClassA::callBackFun));
b->onMessage();
}
结果如下:
为了进一步解决通用性,可以定义一个基类MyObject,需要回调的类可以继承MyObject,这样就可以更方便使用。在cocos2dx便是使用的这种方法。