C++的成员函数指针与Cococs2d-x的selector机制
来源:互联网 发布:数据分析的常用方法有 编辑:程序博客网 时间:2024/05/23 21:29
在Cocos2d-x中点击某个按钮要执行一个回调函数时,一般的写法是以下这样 :
// add a "share" icon to exit the progress. it's an autorelease object CCMenuItemImage *pShareItem = CCMenuItemImage::create( "share.png", "share.png", this, menu_selector(HelloWorld::menuShareCallback));
其中的HelloWorld::menuShareCallback是HelloWorld类的一个函数, 生命为 :
// a selector callback to share button void menuShareCallback(CCObject* pSender);
这个menuShareCallback就相当与Java中Listener的回调函数, 那么Cocos2d-x的selector机制是如何实现的呢 ?
要明白selector机制, 我们首先要清楚C/C++语言中的函数指针, 函数指针其实就是指向函数的指针。 在C/C++中, 函数会以内存地址来标识, 从函数的内存地址开始执行就相当于执行该函数。那么用什么来代表函数指针的地址呢, 其实C/C++语言中的函数名就代表了函数在内存中的地址。看下面的例子 :
#include <iostream>// 定义一个函数指针类型, MethodPointertypedef void (*MethodPointer)(int num);// 普通函数void printNum(int num){ cout << "The num is : " <<num<<endl;}int main(int argc, const char * argv[]){ MethodPointer mp = printNum; mp(444); return 0;}
在文件的上面我们定义了一个函数指针类型MethodPointer,和它对应的函数类型应该是没有返回值的,且有一个Int参数的函数, 例如上文中的void printNum(int num)函数, 在main中我们定义了一个MethodPointer指针,指向了printNum方法,然后执行mp(444);就相当于执行了printNum(444)方法。 对于C++来说还有一种是成员函数指针,它与C中的函数指针类似, 只是指针指向的是某个类中的成员函数。看下面这个例子 :
头文件
#ifndef __MenberCallback__MemberPointer__#define __MenberCallback__MemberPointer__class MemberPointer;// 定义一个成员函数指针typedef void (MemberPointer::*MCallback)(int num);#include <iostream>class MemberPointer{public: MemberPointer(); ~MemberPointer(); void click(MCallback callback); void doSth(int code); } ;#endif /* defined(__MenberCallback__MemberPointer__) */
cpp
#include <iostream>#include "MemberPointer.h"using namespace std;MemberPointer::MemberPointer(){ }MemberPointer::~MemberPointer(){ }void MemberPointer::doSth(int code){ cout<<"call back method. "<<code<<endl;}void MemberPointer::click(MCallback callback){ // 执行回调, 因为在callback中传递的是自身的回调函数doStn,所以直接用this (this->*callback)(888);}
main函数 :
int main(int argc, const char * argv[]){ MemberPointer *mPointer = new MemberPointer(); mPointer->click(&MemberPointer::doSth) ; return 0;}
可见, 在click方法中我们执行了doSth方法, 打印出了888这几个数字。
参考资料 : 成员函数指针
最后模拟一下Cocos2d-x中按钮的selector的实现, 就直接上代码了。
CCObject.h
//// CCObject.h// membercallback//// Created by mrsimple on 4/1/14.// Copyright (c) 2014 mrsimple. All rights reserved.//#ifndef __membercallback__CCObject__#define __membercallback__CCObject__#include <iostream>class CCObject{public: CCObject(); virtual ~CCObject();} ;// 定义回调函数为CCObject或者CCObject子类中的成员函数,两个参数typedef void (CCObject::*ButtonCallback)(CCObject* pSender, int stCode);// 定义selector#define button_selector(_SELECTOR) (ButtonCallback)(&_SELECTOR)#endif /* defined(__membercallback__CCObject__) */
#include "CCObject.h"CCObject::CCObject(){}CCObject::~CCObject(){}
CCButton.h
//// CCButton.h// membercallback//// Created by mrsimple on 4/1/14.// Copyright (c) 2014 mrsimple. All rights reserved.//#ifndef __membercallback__CCButton__#define __membercallback__CCButton__#include <iostream>#include "CCObject.h"class CCButton : public CCObject{public: CCButton(); virtual ~CCButton(); void click(CCObject* pSender); void setCallback(ButtonCallback callback ); private: void buttonClick(CCObject* pSender, int code) ; ButtonCallback _buttonCallback; CCObject* mSender;} ;#endif /* defined(__membercallback__CCButton__) */
CCButton.cpp
//// CCButton.cpp// membercallback//// Created by mrsimple on 4/1/14.// Copyright (c) 2014 mrsimple. All rights reserved.//#include "CCButton.h"using namespace std;CCButton::CCButton():mSender(NULL){}CCButton::~CCButton(){ delete mSender;}// 设置回调函数void CCButton::setCallback(ButtonCallback callback){ _buttonCallback = callback ;}// 按钮点击操作, 执行回调void CCButton::click(CCObject* pSender){ mSender = pSender ; // 执行回调函数,这里执行的则是CCScene中的buttonCallback函数 (mSender->*_buttonCallback)(mSender, 123);}
CCScene.h
//// CCScene.h// membercallback//// Created by mrsimple on 4/1/14.// Copyright (c) 2014 mrsimple. All rights reserved.//#ifndef __membercallback__CCScene__#define __membercallback__CCScene__#include <iostream>#include <iostream>#include "CCObject.h"#include "CCButton.h"class CCScene : public CCObject{public: CCScene(); virtual ~CCScene(); void clickButton();private: CCButton* mButton; void buttonCallback(CCObject* pSender, int code);};#endif /* defined(__membercallback__CCScene__) */
CCScene.cpp
//// CCScene.cpp// membercallback//// Created by mrsimple on 4/1/14.// Copyright (c) 2014 mrsimple. All rights reserved.//#include "CCObject.h"#include "CCButton.h"#include "CCScene.h"using namespace std;// 构造函数, 创建CCButtonCCScene::CCScene():mButton(new CCButton()){ // 设置回调函数 mButton->setCallback( button_selector(CCScene::buttonCallback) ) ;}CCScene::~CCScene(){ delete mButton ;}// 模拟点击按钮的操作void CCScene::clickButton(){ if ( mButton != NULL ) { // 按钮点击 mButton->click(this) ; } }// 点击按钮, 回调该函数void CCScene::buttonCallback(CCObject *pSender, int code){ cout<<"In CCScene --> callback, code = "<<code<<endl;}
main.cpp 使用示例 :
//// main.cpp// membercallback//// Created by mrsimple on 4/1/14.// Copyright (c) 2014 mrsimple. All rights reserved.//#include <iostream>#include "CCObject.h"#include "CCScene.h"int main(int argc, const char * argv[]){ CCScene* sc = new CCScene(); sc->clickButton() ; return 0;}首先定义了CCObject类,该类为Cocos2d-x其他引用类型的基类,并且在头文件中定义了按钮的回调函数指针。CCButton中定义了按钮的点击函数,在该点击函数中执行对应的回调函数。在CCScene场景中添加一个按钮, 并且将该按钮点击的回调函数设置为CCScene类中的buttonCallback成员函数, 然后通过CCScene类中的clickButton函数来显式触发CCButton的click函数,CCButton对象会在click函数中执行点击按钮的回调( 即 CCScene类的buttonCallback函数 ), 最后输出结果。
输出结果
2 0
- C++的成员函数指针与Cococs2d-x的selector机制
- cocos2d-x的成员函数指针
- cococs2d-x与ios关于图片内存的管理
- 成员函数指针与高性能的C 委托
- 成员函数的指针(C++)
- C++:指向对象成员函数的指针
- 关于cococs2d-x帧动画的制作
- selector与函数指针
- 普通函数指针与类成员函数指针的区别
- 成员函数的指针
- 成员函数的指针
- 函数指针,指向成员函数的指针与指向成员变量的指针
- c 结构与成员属性结构 结构与函数 指向结构的指针
- 带成员函数指针的成员函数
- 成员函数指针与高性能的C委托(中篇)
- 类成员函数的函数指针与返回值为函数指针的函数
- C++的成员函数指针简要
- C++的成员函数指针简要
- 束表决函数作用
- 2014-03-13周四:内存释放函数HeapFree ()内存开辟函数HeapAlloc重新开辟函数HeapReAlloc
- iphone simulator 如何添加图片到相册
- 遗传算法解决八数码问题
- 如何不删除armeabi文件夹下的so文件
- C++的成员函数指针与Cococs2d-x的selector机制
- sql Server 的char类型去除空格
- cocos2d-x学习笔记——创建精灵
- 数据库日期参数转换
- 深入探讨C++中的引用
- c++多态性
- javascript二维数组定义
- Linux+ACE 网络编程系列 1 环境布置
- 高性能MySql进化论(二):数据类型的优化_下