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) 。

  • 相关阅读:
    第一篇unity
    C#相关知识小结
    必须知道的八大种排序算法【java实现】
    JAVA八大排序算法
    二进制、八进制、十进制、十六进制之间的转换
    八大排序算法
    JSONArray数据转换成java List
    使用json-lib的JSONObject.toBean( )时碰到的日期属性转换的问题
    一探前端开发中的JS调试技巧
    SpringMVC注解说明
  • 原文地址:https://www.cnblogs.com/fjut/p/2572351.html
Copyright © 2011-2022 走看看