0

0

cocos2dx中函数指针传递的方法

php中文网

php中文网

发布时间:2016-06-07 15:26:10

|

1346人浏览过

|

来源于php中文网

原创

目的 看到群里有个朋友搞了好几天函数指针传递,没搞好。所以写一篇文章,旨在从cocos2dx中帮朋友们找到如何传递指针。 旧版本的函数指针传递 全局函数函数指针调用 一般在C11之前,我们一般是这样定义一个函数指针类型。 [cpp] view plaincopyprint? typede

目的

看到群里有个朋友搞了好几天函数指针传递,没搞好。所以写一篇文章,旨在从cocos2dx中帮朋友们找到如何传递指针。

旧版本的函数指针传递

全局函数函数指针调用

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


[cpp] view plaincopyprint?cocos2dx中函数指针传递的方法cocos2dx中函数指针传递的方法

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

什么意思呢?

[cpp] view plaincopyprint?cocos2dx中函数指针传递的方法cocos2dx中函数指针传递的方法

  1. typedef  void/*return type of function*/  

[cpp] view plaincopyprint?cocos2dx中函数指针传递的方法cocos2dx中函数指针传递的方法

  1. (*pFunc/*the pointer of function*/)  

[cpp] view plaincopyprint?cocos2dx中函数指针传递的方法cocos2dx中函数指针传递的方法

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


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

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

[cpp] view plaincopyprint?cocos2dx中函数指针传递的方法cocos2dx中函数指针传递的方法

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

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

成员函数函数指针的调用

那么成员函数如何调用呢?

只需要加一个类名修饰符即可。

示例如下:

[cpp] view plaincopyprint?cocos2dx中函数指针传递的方法cocos2dx中函数指针传递的方法

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


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

[cpp] view plaincopyprint?cocos2dx中函数指针传递的方法cocos2dx中函数指针传递的方法

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


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

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

cocos2dx 里面std::function定义的各种回调的解析

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

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

HttpRequest 的回调定义为   

  inline void setResponseCallback(const ccHttpRequestCallback& callback)
    {
        _pCallback = callback;
    }

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

typedef std::function ccHttpRequestCallback;

使用过的同学应该知道怎么调用的,

一般都是 setResponseCallback(CC_CALLBACK_2(ClassName::jsonRequestCompleted,this));

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

[cpp] view plaincopyprint?cocos2dx中函数指针传递的方法cocos2dx中函数指针传递的方法

  1. #define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)  
  2. #define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)  
  3. #define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)  
  4. #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,那么我们上面的回调可以变成

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


自定义std::function的应用

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

[cpp] view plaincopyprint?cocos2dx中函数指针传递的方法cocos2dx中函数指针传递的方法

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


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

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

申明:

http://blog.csdn.net/q229827701/article/details/41479753


Python精要参考 pdf版
Python精要参考 pdf版

这本书给出了一份关于python这门优美语言的精要的参考。作者通过一个完整而清晰的入门指引将你带入python的乐园,随后在语法、类型和对象、运算符与表达式、控制流函数与函数编程、类及面向对象编程、模块和包、输入输出、执行环境等多方面给出了详尽的讲解。如果你想加入 python的世界,David M beazley的这本书可不要错过哦。 (封面是最新英文版的,中文版貌似只译到第二版)

下载

相关专题

更多
Word 字间距调整方法汇总
Word 字间距调整方法汇总

本专题整合了Word字间距调整方法,阅读下面的文章了解更详细操作。

2

2025.12.24

任务管理器教程
任务管理器教程

本专题整合了任务管理器相关教程,阅读下面的文章了解更多详细操作。

2

2025.12.24

AppleID格式
AppleID格式

本专题整合了AppleID相关内容,阅读专题下面的文章了解更多详细教程。

0

2025.12.24

csgo视频观看入口合集
csgo视频观看入口合集

本专题整合了csgo观看入口合集,阅读下面的文章了知道更多入口地址。

29

2025.12.24

yandex外贸入口合集
yandex外贸入口合集

本专题汇总了yandex外贸入口地址,阅读下面的文章了解更多内容。

58

2025.12.24

添加脚注通用方法
添加脚注通用方法

本专题整合了添加脚注方法合集,阅读专题下面的文章了解更多内容。

1

2025.12.24

重启电脑教程汇总
重启电脑教程汇总

本专题整合了重启电脑操作教程,阅读下面的文章了解更多详细教程。

3

2025.12.24

纸张尺寸汇总
纸张尺寸汇总

本专题整合了纸张尺寸相关内容,阅读专题下面的文章了解更多内容。

5

2025.12.24

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

1

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 5.9万人学习

Django 教程
Django 教程

共28课时 | 2.4万人学习

Excel 教程
Excel 教程

共162课时 | 9.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号