zoukankan      html  css  js  c++  java
  • 通过源码学习C++函数指针

    通过源码学习C++函数指针
     1:函数指针详解http://www.cnblogs.com/iuices/archive/2011/11/21/2257710.html
    2:正文:
      C++ Code 
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    在CCObject中有这么一堆宏定义,一开始也不是很明白是干嘛用的,做了几个实验后大概猜出他们的作用了;
    这堆就是CCObject中的定义。
    typedef void (CCObject::*SEL_SCHEDULE)(float);
    typedef void (CCObject::*SEL_CallFunc)();
    typedef void (CCObject::*SEL_CallFuncN)(CCNode*);
    typedef void (CCObject::*SEL_CallFuncND)(CCNode*, void*);
    typedef void (CCObject::*SEL_CallFuncO)(CCObject*);
    typedef void (CCObject::*SEL_MenuHandler)(CCObject*);
    typedef void (CCObject::*SEL_EventHandler)(CCEvent*);
    typedef int (CCObject::*SEL_Compare)(CCObject*);

    #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)
    #define compare_selector(_SELECTOR) (SEL_Compare)(&_SELECTOR)

    下面我们抽取某一个来做实验

    //表示定义了一个返回值为void,参数为float的函数指针SEL_SCHEDULE;CCObject只是函数的命名空间。
    typedef void (CCObject::*SEL_SCHEDULE)(float);
    //宏定义,将括号内的函数取地址获得该函数的指针并转换为SEL_SCHEDULE类型.
    #define schedule_selector(_SELECTOR) (SEL_SCHEDULE)(&_SELECTOR)

    this->schedule(schedule_selector(HelloWorld::update));

    void HelloWorld::update(float delta){…一些处理语句…}

    这种用法作为一个java来说我一开始觉得好像反射。通过函数名调用函数。也没看懂前面的用法。所以自己写了一个简单的程序做测试。

    #include<stdio.h>
    typedef void (*HELLO)(int);
    #define func(_FUN_NAME_) (HELLO)(&_FUN_NAME_)

    void printLog(int i)
    {
        printf("Log.....%d ",i);
    }
    int main()
    {
        (func(printLog))(3);
    }

    这样写出来就很简单明了了。首先我们定义了一个函数指针HELLO,这个函数指针的类型是指向一个返回值为void,参数为int型的函数指针。下面我们又用宏定义了一个func转换,通过函数名取地址获得函数的指针并将其转换为HELLO类型。主函数式调用。可以看到当我输入函数名并在小括号中传入3后控制台将会打印
    Log……3
    这么一句话。而在cocos2dx中的源代码调用远比我这里的复杂多。可以想象这种和java的反射机制类似,又或者叫代理设计模式。


  • 相关阅读:
    jq判断鼠标滚轴向上滚动还是向下滚动
    Directory 中user Var 如何添加到通道变量中?
    Centos 6.5 freeswitch 编译mod_shout
    golang esl api
    opensips redis配置记录
    luasocket 安装记录 (FS1.4)
    luasocket 安装记录 (FS1.6)
    Callcenter 模块解析
    OpenSIPS 1.11.1安装记录
    阿里服务器挂载数据盘
  • 原文地址:https://www.cnblogs.com/leejuen/p/5547479.html
Copyright © 2011-2022 走看看