zoukankan      html  css  js  c++  java
  • typedef void (SelectorProtocol::*SEL_MenuHandler)(CCObject*);

    cocos2d-x工程里面的HelloWorldScene.cpp文件有这么一行:

    // Create a "close" menu item with close icon, it's an auto release object.
    CCMenuItemImage *pCloseItem = CCMenuItemImage::itemFromNormalImage("CloseNormal.png", "CloseSelected.png", this, menu_selector(HelloWorld::menuCloseCallback));

    里面有个回调函数menu_selector(HelloWorld::menuCloseCallback),平时都是按照他的方式去写的,并不知道里面的实现过程,今天碰到了类似的问题,所以小研究了下。

    进入menu_selector()的定义文件 selector_protocol.h 可以看到:

    class CCNode;
    typedef void (SelectorProtocol::*SEL_SCHEDULE)(ccTime);
    typedef void (SelectorProtocol::*SEL_CallFunc)();
    typedef void (SelectorProtocol::*SEL_CallFuncN)(CCNode*);
    typedef void (SelectorProtocol::*SEL_CallFuncND)(CCNode*, void*);
    typedef void (SelectorProtocol::*SEL_CallFuncO)(CCObject*);
    typedef void (SelectorProtocol::*SEL_MenuHandler)(CCObject*);
    typedef void (SelectorProtocol::*SEL_EventHandler)(CCEvent*);
    
    #define schedule_selector(_SELECTOR) (SEL_SCHEDULE)(&_SELECTOR)
    #define callfunc_selector(_SELECTOR) (SEL_CallFunc)(&_SELECTOR)
    #define callfuncN_selector(_SELECTOR) (SEL_CallFuncN)(&_SELECTOR)
    #define callfuncND_selector(_SELECTOR) (SEL_CallFuncND)(&_SELECTOR)
    #define callfuncO_selector(_SELECTOR) (SEL_CallFuncO)(&_SELECTOR)
    #define menu_selector(_SELECTOR) (SEL_MenuHandler)(&_SELECTOR)
    #define event_selector(_SELECTOR) (SEL_EventHandler)(&_SELECTOR)

    其中:

    typedef void (SelectorProtocol::*SEL_MenuHandler)(CCObject*);
    #define menu_selector(_SELECTOR) (SEL_MenuHandler)(&_SELECTOR)

    typedef  定义了函数指针类型 SEL_MenuHandler,  该函数的返回值是void, 参数类型是CCObject* 。

    #define 了有参数的宏。

    所以,在编译预处理时 menu_selector(HelloWorld::menuCloseCallback) 被替换为 (SEL_MenuHandler)(&(HelloWorld::menuCloseCallback))  在编译时,函数指针调用函数并传入参数 &(HelloWorld::menuCloseCallback) 。

  • 相关阅读:
    Beta 冲刺 (5/7)
    Beta 冲刺 (4/7)
    Beta 冲刺 (3/7)
    软件产品案例分析(团队)
    Beta 冲刺 (2/7)
    Beta 冲刺 (1/7)
    BETA 版冲刺前准备
    Alpha事后诸葛(团队)
    设计模式——访问者模式
    设计模式——命令模式
  • 原文地址:https://www.cnblogs.com/fjut/p/2572351.html
Copyright © 2011-2022 走看看