成员函数指针实现的回调
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`指针的存在,以及如何正确声明和调用成员函数指针。
这在很多情况下是不方便的,尤其是在需要将函数作为回调注册到其他库或框架的情况下,这些库或框架通常希望提供一个简单的、不需要额外参数的函数指针。 #### 解决方案1: 使用单例模式 一种解决方案是在类内部定义...
为了使成员函数可存储,我们需要一个对象实例和成员函数指针。例如,可以使用`std::bind`或者lambda表达式来包装成员函数和其对应的对象实例: ```cpp class MyClass { public: void memberFunction(int arg) {...
在Linux系统中,C语言是一种基础且强大的编程语言,它提供了丰富的功能,其中包括函数指针和回调函数的概念。本文将深入探讨这两个主题,并通过实际的示例代码来帮助你理解和应用它们。 首先,我们来理解函数指针。...
函数指针分为两类:一般(普通)函数指针和类成员函数指针。这两种类型的指针在用法上有所区别,且类成员函数指针涉及到更复杂的面向对象特性。本文将深入探讨它们的区别以及如何进行强制转换。 首先,让我们从一般...
在C++编程中,通过函数指针调用非静态成员函数是一种高级技巧,主要用于实现回调、动态绑定等场景。本文将详细探讨如何在Visual C++ 6.0 (VC6.0) 和Borland C++ Builder 6.0 (BCB6.0) 中实现这一功能。 #### 一、...
在MFC中,我们可以使用C++的成员函数作为回调,但需要解决成员函数指针不能直接作为普通函数指针的问题。 首先,我们需要理解回调函数的基本概念。回调函数是一种函数,它的地址被存储在另一个函数中,当那个函数...
为了解决这个问题,我们需要采用一些策略来实现C回调C++成员函数。 首先,我们需要理解C语言与C++的差异。C语言是过程式的,不支持类和成员函数。而C++是面向对象的,提供了类、继承和多态等特性。因此,当我们想要...
成员函数指针提供了一种方法,使得可以在运行时动态地调用类的成员函数,这对于实现诸如事件处理机制或回调机制等非常有用。 #### 实现高性能的C++委托 **委托**在C++中通常是指一种能够存储并执行函数的对象。它...
在C++中,成员函数指针是一个强大的工具,尤其在事件驱动和多线程编程中,它可以用来作为回调函数的接口。成员函数指针能够直接指向类中的某个特定函数,使得我们可以在不知道具体函数名的情况下调用某个对象的成员...
1. **回调函数**:在需要调用特定对象的成员函数作为回调时,可以将成员函数指针作为参数传递。 2. **函数对象(Functor)**:成员函数指针可以用于实现类似于函数对象的行为,特别是在C++标准库中的算法中,如`std...
2. **非静态成员函数指针**:非静态成员函数指针需要一个对象实例才能调用,因此在使用非静态成员函数指针时,需要提供对应的类实例。 3. **typedef简化函数指针**:为了简化函数指针的使用,可以使用`typedef`创建...
C++中的成员函数指针是一种特殊的指针类型,它可以...总的来说,C++中的成员函数指针和functor是两种不同的但相关的机制,它们都能实现将行为作为值传递的效果。理解并熟练运用这些概念对于提升C++编程能力非常有帮助。
在这个"SDK和成员函数作为回调函数demo"中,我们将深入探讨如何在SDK的上下文中使用成员函数作为回调函数。 首先,SDK中的接口通常是通过函数调用来实现功能的,这些函数可能需要开发者提供一个函数指针,以便在...
网上的回调函数都是API例子,学习函数指针倒是不错,可是很难让初学者立即应用。常见的情况是辅线程完成某事件后需要“通知”主界面,比如常见的进度条——线程中完成一定的进度后即通知主界面显示到一定的刻度。本...
在C++中,除了使用函数指针,还可以使用成员函数指针或者std::function来实现回调。成员函数指针适用于类的成员函数作为回调的情况,而std::function则提供了更灵活的回调机制,可以存储任何可调用对象,包括普通...
} 通过以上两个例子,我们可以看到,将类成员函数用作C回调函数主要面临的问题在于C++成员函数的`this`指针。`this`指针在成员函数中用于访问对象的实例数据,但在C回调函数中并不存在这样的机制,因此我们需要采取...
本文实例分析了C++中回调函数...由于this指针的作用,使得将一个CALL-BACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败。要解决这一问题的关键就是不让thi