成员函数指针实现的回调
1、回调的类型设置成基类的成员函数,每次set时进行转换
2、回调的参数是menuItem自身
3、回调的实现是 m_pListener->*m_pfnSelector)(this); 即初始化的时候,设置的是监听者(负责处理回调的指针),
回调内的参数是被点击的对象指针,一般情况下 这2个是一致的。
例子:cocos2d-x中的实现
1、CCObject.h
typedef void (CCObject::*SEL_MenuHandler)(CCObject*); // 定义回调类型
#define menu_selector(_SELECTOR) (SEL_MenuHandler)(&_SELECTOR) // 定义转换成合适类型的功能函数, 注意为了可移植性 要用取地址的符号 &
2、CCMenuItem.cpp 中
bool CCMenuItem::initWithTarget(CCObject *rec, SEL_MenuHandler selector) // 设置回调,和负责监听的对象
{
setAnchorPoint(ccp(0.5f, 0.5f));
m_pListener = rec;
m_pfnSelector = selector;
m_bIsEnabled = true;
m_bIsSelected = false;
return true;
}
void CCMenuItem::activate()
{
if (m_bIsEnabled)
{
if (m_pListener && m_pfnSelector)
{
(m_pListener->*m_pfnSelector)(this); // 触发回调,从上一层的menu来调用
}
if (kScriptTypeNone != m_eScriptType)
{
CCScriptEngineManager::sharedManager()->getScriptEngine()->executeMenuItemEvent(this);
}
}
}
3、使用的方式
CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
this, // 设置listener
menu_selector(HelloWorld::menuCloseCallback));// 设置callback
void HelloWorld::menuCloseCallback(CCObject* pSender) // 真正的回调函数
{
CCDirector::sharedDirector()->end();
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
exit(0);
#endif
}
相关推荐
本文实例分析了C++中回调函数...由于this指针的作用,使得将一个CALL-BACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败。要解决这一问题的关键就是不让thi
程序员常常需要实现回调。本文将讨论函数指针的基本原则并说明如何使用函数指针实现回调。注意这里针对的是普通的函数,不包括完全依赖于不同语法和语义规则的类成员函数(类成员指针将在另文中讨论)。
用此函数库可以将成员函数指针转为普通函数指针 测试代码如下 #include #include #include #include #include #include using cmpfunc = int(__cdecl*)(const void*, const void*); using DebugArrayFunc = ...
本文将讨论函数指针的基本原则并说明如何使用函数指针实现回调。注意这里针对的是普通的函数,不包括完全依赖于不同语法和语义规则的类成员函数(类成员指针将在另文中讨论)
网上的回调函数都是API例子,学习函数指针倒是不错,可是很难让初学者立即应用。常见的情况是辅线程完成某事件后需要“通知”主界面,比如常见的进度条——线程中完成一定的进度后即通知主界面显示到一定的刻度。本...
以前确实大家都是这样做的,在静态的成员函数中再查找this指针,它多半是全局变量,或者是回调函数提供的附加参数。如果是前 者,就会大大破坏程序的结构。而现在,随着社会生产力的发展,偶们已经能做到将成员函数...
由于this指针的作用,使得将一个CALL-BACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败。要解决这一问题的关键就是不让this指针起作用,通过采用以下两...
将函数指针作为结构体成员,可以实现函数注册和回调 代码如下:struct T{ void (*callback)(char *);};void doSomething(char *job){ //TODO…}int main(){ T t; t.func = doSomething; //调用回调函数 t.func...
1.其中tcCallBack的作用是希望通过将Receiver类的成员函数注册到Call中, Call类的对象在合适的时候调用该回调函数实现运算或者传值。需要注意的是本DEMO需要提前在Call中声明回调函数的指针,返回值,参数以及它们...
C++中回调函数及函数指针的实例详解 如何获取到类中函数指针 实现代码: //A类与B类的定义 ...//定义类的成员函数指针 typedef void (A::*A_mFun)(void); typedef void (B::*B_mFun)(void); int main
只要象C/C++这样支持函数指针的语言都 有回调函数的概念,它实际上是向被调用函数传一个你的函数地址,然后被调用函数向通过你传 入的函数地址来调用你的函数 。 以上是结构化回调,到高级语言Object Pascal、C++...
如何保证即将析构对象 x 的时候,不会有另一个线程正在调用 x 的成员函数?或者说,如何保证在执行 x 的成员函数期间,对象 x 不会在另一个线程被析构?如何避免这种竞态条件是 C++ 多线程编程面临的基本问题,可以...
5、 如果希望把对象成员函数指针作为回调函数要考虑什么? 6、 类的静态成员变量与全局变量的比较? 7、 什么是抽象类?释构函数可以声时为抽象函数吗? 8、 谈谈你对软件工程的认识。 9、 你熟悉vml吗? 10、对于...
首先,回调机制的技术基础是函数指针。函数指针就是带有参数的指针,只要它和一些函数的原型一致,它们就可以互相赋值。在此基础上我们定义了回调机制。回调机制就是在一个函数的形参中定义一个函数的指针,在函数...
如何保证即将析构对象 x 的时候,不会有另一个线程正在调用 x 的成员函数?或者说,如何保证在执行 x 的成员函数期间,对象 x 不会在另一个线程被析构?如何避免这种竞态条件是 C++ 多线程编程面临的基本问题,可以...
对话框用户界面程序的编写,如何向对话框控件关联数据成员及其实现机理,如何利用对话框类的成员函数向控件发送消息和获取对话框控件的类指针,如何直接利用对话框控件类操纵对话框控件(发送消息和直接调用成员函数...
对话框用户界面程序的编写,如何向对话框控件联接数据成员及其实现机理,如何向对话框控关联控件类,如何利用对话框类的成员函数向控件发送消息和获取对话框控件的类指针,如何直接利用对话框控件类操纵对话框控件...
该包是个代码包,里面是介绍通过cpp实现的一个简单的注册回调框架,这个框架是基于成员函数指针+map实现的;用于优化程序结构(比如:可以取代繁长的switch----case)。
表 1 unique_ptr指针可调⽤的成员函数 成员函数名 成员函数名 功 功 能 能 operator*() 获取当前 unique_ptr 指针指向的数据。 operator->() 重载 -> 号,当智能指针指向的数据类型为⾃定义的结构体时,通过 -> ...