C与VC下面的函数指针

在标准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)();

 

上面定义的一一映射表是在一个类里面的方法,要建方与别的类的方法的一一映射关系,你可以试一下。呵呵。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值