从Cocos2d-x中寻找函数指针传递的方法(转)

3 篇文章 0 订阅
2 篇文章 0 订阅

本文主要讲解从Cocos2d-x中找到如何传递指针。


旧版本的函数指针传递

全局函数函数指针调用

一般在C++11之前,我们一般是这样定义一个函数指针类型。

1
typede  void (*pFunc)( int ,...);


什么意思呢?

1
2
3
4
typedef   void /*return type of function*/  
(*pFunc /*the pointer of function*/ )  
( int ,... /*the types of function parameters*/ );  
typedef   void /*函数返回类型*/ (*pFunc /*函数指针*/ )( int ,... /*函数参数类型*/ );

OK,那么好了,该如何调用呢?


一般来说是像下面这样的:

1
2
3
4
typedef  void (*pFunc)();   
void  fA(){ };  
void  fB(pFunc pf){ (*pf)( /*里面加函数参数*/ ) };  
void  fC(){  fB(&fA);};

即为在fC中调用fB,fB的参数为fA指针。


成员函数函数指针的调用

那么成员函数如何调用呢?只需要加一个类名修饰符即可。

示例如下:

1
2
3
4
5
class  C;  
typedef  void (C::*pFunc)();  
void  C::fA(){};  
void  C::fB(pFunc pf){ ( this ->*pf)()};  
void  C::fC(){ this ->fB(&C::fA);};

其实,有心的朋友应该会注意到Cocos2d-x 版本中的各种selector即为宏定义的函数指针的引用,定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
typedef  void  (Ref::*SEL_CallFunc)();  
typedef  void  (Ref::*SEL_CallFuncN)(Node*);  
typedef  void  (Ref::*SEL_CallFuncND)(Node*,  void *);  
typedef  void  (Ref::*SEL_CallFuncO)(Ref*);  
typedef  void  (Ref::*SEL_MenuHandler)(Ref*);  
typedef  void  (Ref::*SEL_SCHEDULE)( float );  
   
#define callfunc_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFunc>(&_SELECTOR)  
#define callfuncN_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncN>(&_SELECTOR)  
#define callfuncND_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncND>(&_SELECTOR)  
#define callfuncO_selector(_SELECTOR) static_cast<cocos2d::SEL_CallFuncO>(&_SELECTOR)  
#define menu_selector(_SELECTOR) static_cast<cocos2d::SEL_MenuHandler>(&_SELECTOR)  
#define schedule_selector(_SELECTOR) static_cast<cocos2d::SEL_SCHEDULE>(&_SELECTOR)

所以不懂函数指针的朋友完全可以模仿它。 相信你很快就能上手。


C++11 中std::function的应用

Cocos2d-x里面std::function定义的各种回调的解析

假设我们不知道std::function如何使用,那么只有浏览Cocos2d-x 3.x里面的源码,我们会发现有大量的callBack 是用std::function定义的。


我们在此,首先用Cocos2d-x里面的网络http请求的返回函数举例。

HttpRequest 的回调定义为: 

1
2
3
4
inline  void  setResponseCallback( const  ccHttpRequestCallback& callback)
{
      _pCallback = callback;
}

追踪ccHttpRequestCallback,可以发现ccHttpRequestCallback即为std::function定义的: 

1
typedef  std::function< void (HttpClient* client, HttpResponse* response)> ccHttpRequestCallback;

使用过的同学应该知道怎么调用的,一般都是 

1
setResponseCallback(CC_CALLBACK_2(ClassName::jsonRequestCompleted, this ));

CC_CALLBACK是什么东东,其实就是std::bind的引用宏定义。我们查看定义如下:

1
2
3
4
#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)  
#define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)  
#define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)  
#define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)

很明显,CC_CALLBACK_2就是 std::bind里面传参数,第一个是引用参数表示函数,第二个是目标,第三个,第四个是占位符,后面是不定参数。


所以可以等价代换为std::bind,那么我们上面的回调可以变成

1
setResponseCallback(std::bind(&ClassName::jsonRequestCompleted, this ,std::placeholders::_1,std::placeholders::_2));


自定义std::function的应用

通过以上分析,相信大家已经掌握了如何通过std::function传递函数,以及std::bind去调用。不过为了照顾一些基础薄弱的朋友,我还是给出一个简单的例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class  C;  
void  C::fA(){}  
   
void  C::fB( const  std::function< void ()> &func)  
{  
   
     if  (func)  
     {  
         func();  
     }  
}  
void  C::fC()  
{  
   fB(std::bind(&c::fA, this ));  
}


关于非成员函数使用std::function

非成员函数使用std::function和上面的函数指针实际上是一致的,鉴于它比较容易,就不在此赘述了,还不会的朋友可以试一下。


来源网址:http://blog.csdn.net/q229827701/article/details/41479753

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值