coco2dx看了段时间了,但是期初对于CC_CALLBACK这个宏只会用不理解是什么意思,今天一探究竟。
先来看源码CC_CALLBACK_1的定义,其他的一次类推。
#define CC_CALLBACK_1(__selector__,__target__,...)
std::bind(&__selector__,__target__,std::placeholders::_1,##__VA_ARGS__)
- 令初学者困惑的就是std::bind()是个什么,解释如下
int functionA (int a,int b) //定义functionA函数,有两个参数
{
return a+b;
}
//用std::function定义functionB函数,稍后介绍这个
std::function<int(int,int)> functionB;
//用bind绑定functionA和functionB,_1表示输入到第一个参数里,_2是第二个
functionB = std::bind(functionA,std::placeholders::_1,std::placeholders::_2);
functionB(1,2)//等同于functionA(1,2)
functionB = std::bind(functionA,std::placeholders::_2,std::placeholders::_1);//注意_1和_2换了位置
functionB(1,2)//等同于functionA(2,1),即把“1”按functionA中
//的第二个参数传入,“2”按functionA中第一个参数传入
//以上是函数,如在类里面用的话定义如下,类名为HelloWorld
functionB = std::bind(
&HelloWorld::functionA,this,std::placeholders::_1);
简单地说bind就是绑定两个函数,当调用functionB时就相当于调用了functionA,而_1、_2、_3等等是按functionA中参数顺序排列的。这个是游戏场景之间子场景向上一级的场景传递消息时会用到,即反向传值,会在以后的学习中跟大家分享。
下面简单介绍下std::function,可以把他类比成为一种数据结构理解
std::function<int(int,char)> fun;//与int fun(int a,char b)等价 std::function<bool(bool,int,int)> fun;//与bool fun(bool a,int b,char c)等价
通俗点说,()里面只写函数参数的类型,有几个参数就写几个类型,<>中是函数返回值的类型。那么问题又来了,我定义了一个fun但是函数体在哪里写呀,这个时候就要用到Lambda表达式了,代码如下:
std::function<int(int,char)> fun;
fun = [](int a,char b){
return a+b;
};
( )中间是参数,{ }中间就是函数体,[ ]中间的参数表示捕获变量。其中,中括号中的参数我目前只用到过这种情况,就是我要在函数体里面调用该类的全局变量就要把这个全局变量写进去,否则无法调用。如在coco2dx中你要在你的lambda表达式中用到本层this指针式就得把this写进去,如下代码:
std::function<int(int,char)> fun;
//////////////////正确////////////////
fun = [this](int a,char b){//把this写进去,全局变量也要写进去否则也不能用
....
this->addChild(一个精灵);
....
return a+b;
};
//////////////////错误////////////////
fun = [](int a,char b){//没有写this
....
this->addChild(一个精灵);
....
return a+b;
};
总结:为什么要这么定义,就我目前看到的这个是为了便于数据之间的相互传递。