cocos2dx的CC_CALLBACK是个什么宏

cocos2dx的CC_CALLBACK是个什么宏,第1张

概述coco2dx看了段时间了,但是期初对于CC_CALLBACK这个宏只会用不理解是什么意思,今天一探究竟。 先来看源码CC_CALLBACK_1的定义,其他的一次类推。 #define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##_

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中第一个参数传入//以上是函数,如在类里面用的话定义如下,类名为HelloWorldfunctionB = 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;       };

总结:为什么要这么定义,就我目前看到的这个是为了便于数据之间的相互传递。

总结

以上是内存溢出为你收集整理的cocos2dx的CC_CALLBACK是个什么宏全部内容,希望文章能够帮你解决cocos2dx的CC_CALLBACK是个什么宏所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1063088.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存