通过源码学习C++函数指针

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a88141302/article/details/27949389
通过源码学习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\n",i);
}
int main()
{
    (func(printLog))(3);
}

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

展开阅读全文

没有更多推荐了,返回首页