天天看點

C++ 類成員函數指針數組應用(一)

前言

    閱讀本文之前你需要明确知道函數指針和普通函數的差別,對這兩者本文不做過多說明

目标

    使用函數指針數組建立一套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

繼續閱讀