類成員函數(shù)指針淺析

字號:

有這樣一行代碼:
    typedef CPB_RETVAL (CPBprb_Prb::*CPBprb_action)(CPBprb_Prb &, unsigned);
    其中CPB_RETVAL是一個enum類型,CPBprb_Prb是一個類,CPBprb_action在代碼中其他地方?jīng)]有找到定義。因不知這行代碼所為何意,遂在論壇發(fā)貼請教http://topic.csdn.net/u/20080908/11/0f127830-8c90-414d-9bab-5d946b115522.html?seed=1500702230。
    承蒙眾多高手賜教,才知上段代碼定義了成員函數(shù)指針類型CPBprb_action,該類型函數(shù)有2個參數(shù),類型分別為CPBprb_Prb &, unsigned,返回值類型為CPB_RETVAL。此函數(shù)指針的類型有個定義域,它是類CPBprb_Prb的成員(CPBprb_Prb::*CPBprb_action)。
    另外,CPBprb_action不僅可以指向CPBprb_Prb的成員函數(shù),也可以指向CPBprb_Prb的派生類成員函數(shù)。甚至,CPBprb_Prb里可以根本就沒有任何諸如CPB_RETVAL functionName (CPBprb_Prb &, unsigned)這樣的函數(shù),而完全可以在CPBprb_Prb的派生類里去增加 CPB_RETVAL functionName (CPBprb_Prb &, unsigned);這樣的函數(shù),如:
    #include
    class A
    {
    public:
    A(){};
    virtual ~A(){};
    };
    class B : public A
    {
    public:
    B(){};
    ~B(){};
    int Fb(int a){ return a*a;}
    };
    typedef int (A::*Myfunction)(int);
    int main()
    {
    B* pB = new B;
    Myfunction pf = (Myfunction)(&B::Fb);
    int retValue = (pB->*pf)(3);
    std::cout<  std::cin>>retValue;
    return 1;
    }
    通過typedef int (A::*Myfunction)(int);定義的Myfunction是A的成員(函數(shù)指針),但只能在類外定義。
    需要指出的是,使用指向成員函數(shù)的指針變量是比較危險的!因此不建議這么用。
    (上文引用了論壇中對我帖子的回復(fù),再次對關(guān)心并幫助我的人表示感謝。)
    PS:
    函數(shù)指針(全局函數(shù)/類成員函數(shù))和函數(shù)對象
    (原文鏈接:http://www.ccrun.com/article.asp?i=1005&d=sc37og)
    關(guān)鍵字:函數(shù)指針 全局函數(shù) 類成員函數(shù) 函數(shù)對象 Function object
    作者:ErranLi 更新:2007-01-06 02:31:47 瀏覽:9166
    函數(shù)指針(全局函數(shù)/類成員函數(shù))、函數(shù)對象(Function object)