在标准C&C++下面,函数指针的用法如下:
定义一个函数指针模板
typedef char *(*lpExecFunc)(char *);
它对应的函数类型如下:
char * DealDB2Query(char * lpInbuffer)
{
}
在使用的地方,我们可以先定一个函数针
lpExecFunc pDealFunc;
然后赋值
pDealFunc = DealDB2Query;
然后我就们可以使用这个函数指针来调用相应的函数了
char *retstr = pDealFunc ("inoutstr");
============================================
使用函数指针有什么好处呢,好处多得是呢,它有点像C#下面的delegate,代理。
如果,你需要根据一个number或者是一个string定义决定调用一个函数,一般情况下,我们可以使用if() else()或者是switch()case:()来判断调用,但是如果这些number或者是string有一百个,难道我们的if()else()分支需要写一百个吗?显然很麻烦。
但是我们可以定义一个结构体类型如下:
再定义一个结构体数据如下:
以上第一列为#define定义的short,第二列都是类型如下的函数
char * DealDB2Query(char * lpInbuffer)
{
}
这样的话,我们就建立了一个一一映射的结构体数组,那么在根据number来判断调用函数的时候,我们就可以使用一个循环就可以了,如下,而不必再使用if else
是不是简单多了,其实利用函数指针,可以应用很多设计模式,如服务注册,客户可以往某个服务注册自己,然后每个客户都有自己的处理函数,这样的话,总服务就可以根据每次客户的请求ID直接调用相应事先注册好的函数,客户也可以随时注销自己的服务,对总服务来说,是不知不觉的。
反正函数指针是一个不错的东西,有空多用用。呵呵。
===================================================================
如标题所说,还有一个叫VC下面的函数指针,C++是面向对象的语言,但它也可以写过程化的程序,到了VC里面,纯面身对象,这时候,我们要使用函数指针,就不像在C下面那么容易了,动不动什么都是全局的,下面具一个例子:
那么在根据请求字符串ID-methodname的时候,我们可以这样来调用:
以上跟C里面是差不多的调用,不过因为到类这一模型,语法有点不同而矣。
特别注意的是,上面(this->*RequestFunctionTable[n].lpExecFunc)();
好像要这样引用来调用来可以,我试了很多种方法,都没有编译通过,最可笑的是,编译通过的,调试的时候,它竟然不执行。
如下调用不行:
(*RequestFunctionTable[n].lpExecFunc)();
(*RequestFunctionTable[n].lpExecFunc)(void);
(*RequestFunctionTable[n].lpExecFunc)(0);
还有几种,看上去可以,实际上编译不通过
如下编译通过,但是调用不了:
RequestFunctionTable[n].lpExecFunc;
一定要
(this->*RequestFunctionTable[n].lpExecFunc)();
上面定义的一一映射表是在一个类里面的方法,要建方与别的类的方法的一一映射关系,你可以试一下。呵呵。