前言
閱讀本文之前你需要明确知道函數指針和普通函數的差別,對這兩者本文不做過多說明
目标
使用函數指針數組建立一套bpm工作流架構。這套架構在各種oa以及某幾個大型通信公司應用的很廣泛
适應場景
多分枝(類似Swtich)條件下、處理函數的形參清單和傳回類型相同。如:
int func1(const char *pszContent);
int func2(const char *pszContent);
...
int funcN(const char *pszContent);
void processMsg(int iMsgType, const char *pszContent)
{
switch(iMsgType)
{
case 1: func1(pszContent);
break;
case 2: func2(pszContent);
break;
...
case N: funcN(pszContent);
break;
}
對于上述場景,我們可以采用函數指針數組的方式處理,如下:
typedef int (*pFunc)(const char*); //建立函數指針
pFunc arrFuncPoint[n+1]; //建立函數指針數組
//初始化指針數組
void init()
{
arrFuncPoint[0] = 0;
arrFuncPoint[1] = func1;
arrFuncPoint[2] = func2;
...
arrFuncPoint[N] = funcN;
}
//調用函數
char szContent[""] = "HelloWorld";
arrFuncPoint[iIndex](szContent);
場景更新
有時候為了代碼複用,比如電腦程式,我們把這些函數封裝到一個類中,作為類的成員函數。現在場景就從普通函數更新為類的成員函數指針數組。如下:
class CFunction
{
public:
CFuntion();
~CFuntion();
void testFunc(int iPos);
protected:
void func1(int iNum) {printf("%d\n", iNum);}
void func2(int iNum) {printf("%d\n", 2*iNum);}
private:
//特别注意定義成類的作用域,後面講原因
//typedef void (CFunction::*pFunc)(int);
//pFunc m_arrFunc[2];
//效果等同上述兩條語句
void (CFunction::*pFunc[2])(int);
}
CFunction::CFunction()
{
pFunc[0] = &CFunction::func1;
pFunc[1] = &CFunction::func2;
}
void CFunction::testFunc(int iPos, int iNum)
{
(this->*pFunc[iPos])(iNum);
}
那為什麼定義函數指針數組時要明确指出類的作用域呢?
因為對于非static的成員函數,函數的真正原型并不是你所看到的那樣。比如上面聲明了void func1(int iNum),其實真正的原型是形參清單前面有個this指針,也就是void func1(this, int iNum);是以在建立函數指針時要按結構來。但是對于普通的函數和static函數并不用給出作用類,因為函數形參中并沒有this指針,故能省略掉類作用域。
C++類成員函數指針數組應用(二)
參考連結:https://segmentfault.com/q/1010000004233580