cocos2dx的CC_CALLBACK是个什么宏

9 篇文章 1 订阅
8 篇文章 0 订阅

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::_2,
                      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;
       };

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值