C++中的函数指针及其应用
swith/case作为一种基础的流程控制语句,在我们的日常编码中应用很广泛,但是当case分支很多,每种case下的处理流程又比较复杂时,整个switch/case结构可能会很庞大、随之带来的是函数的圈复杂度很高,代码不利于维护,其实这时候我们可以考虑用函数指针的数组取代swith/case分支。
C中的函数指针大家估计都比较熟悉了,如同数据指针具有所指的数据类型一样,函数指针也具有类型,它的类型即为所指函数的类型,包括返回值和参数列
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
,如int (*fun)(int i, double j)便定义了一个指向返回值类型为int,含有两个参数、类型分别为int 和double的函数指针,C++中的函数指针跟C中相似,不同的是C++中的函数指针多了域限定符,即C++中的函数指针具有三要素:参数个数及类型、返回值类型、所属的类,如对于如下的类:
class test
{
public:
bool add(int i, int j);
public:
bool (test::*pFun)(int n, int m);
}
我们要定义指向成员函数test的函数指针,则形式如下:bool (test::*pFun)(int n, int m),指向类成员函数的指针必须通过类对象或指向该类类型的对象的指针来访问,如:
test a, *pTest;
(a.*pFun)(int i, int j);
(pTest->*pFun)( int i, int j);
如果要定义该类型函数指针的数组,形式如下:bool (test::*pFun[MAX_NUM])(int n, int m);
此时对于如下结构的代码:
class test
{
public:
bool ProcessMsg(const BYTE *pMsg);
BYTE GetCommCode(const BYTE *pMsg);
}
test::ProcessMsg(const BYTE *pMsg)
{
BYTE bCommCode = GetCommCode(pMsg);
switch(bCommCode)
{
case 0:
//一些复杂的处理
case:
//又一些复杂的处理
case:
//还是复杂的处理
…
default:
}
}
此时,我们可以把每个case下的处理提出来,作为一个单独的函数,因为这些处理相似,那么这些函数可能具有相同的类型(返回值、参数列表都相同),然后定义一个该类型的函数指针数组,在初始化是利用这些函数的制止初始化该指针数组,然后在processMsg()函数中直接通过函数指针数据调用这些函数即可,如下:
class test
{
public:
test();
bool ProcessMsg(const BYTE *pMsg);
BYTE GetCommCode(const BYTE *pMsg);
bool processMsgA(const BYTE *pMsg);
bool processMsgB(const BYTE *pMsg);
bool processMsgC(const BYTE *pMsg);
...
public:
bool (test::pMsgProcess[MAX_NUM])(const BYTE *pMsg);
}
test::test()
{
pMsgProcess[0] = processMsgA;
pMsgProcess[1] = processMsgB;
pMsgProcess[2] = processMsgC;
...
}
test::ProcessMsg(const BYTE *pMsg)
{
BYTE bCommCode = GetCommCode(pMsg);
(this->*pMsgProcess[bCommCode])(pMsg);
}