乙個類成員函式指標的應用例子

2021-04-01 17:05:18 字數 1682 閱讀 8658

在c++平靜的海面底下,隱藏著許許多多暗礁,而類成員函式指標絕對是其中最險惡的之一。所以如果不幸碰到它,那麼一定要打醒十二分精神,這是我的小小體會。

下面來看看乙個簡單的例子。

class base

virtual ~base() {}

public:

typedef void (base::*func)();

void setf (func f)

func getf ()

private:

func f_; };

class derived : public base

void test2 ()

};這裡定義了兩個類base和derived。其中base類定義了乙個類成員函式指標,看看它的語法,還是蠻怪異的:

typedef void (base::*func)();

因此func就成了乙個新的型別,這個型別的含義就是指向類成員函式的指標,而該類成員函式不需要入參,返回值是void。然後我們可以用func來定義變數,當成base的私有成員,並且定義了get、set函式來對它進行訪問。

接著我們來定義乙個derived類,從base繼承而來。在derived類中定義了若干方法test1和test2,注意這些test1()和test2()必須符合func的簽名,也就是說,函式的入參和返回值必須一致。

我們可以來寫**:

base *p = new derived;

p->setf (&derived::test1);

我本意是想把derived的成員函式賦值給f_儲存起來,結果編譯了一下,vc6編譯器不高興了:

error c2664: 'setf' : cannot convert parameter 1 from 'void (__thiscall derived::*)(void)' to 'void (__thiscall base::*)(void)'

types pointed to are unrelated; conversion requires reinterpret_cast, c-style cast or function-style cast

ok,原來我在寫&derived::test1時,其實它的型別是void (__thiscall derived::*)(void),而定義在base中的成員變數f_,它的型別是func,也就是void (__thiscall base::*)(void),這兩者之間沒有隱式轉換的關係,必須顯式進行轉換。我改了一下,變成:

p->setf (static_cast(&derived::test1));

加了乙個static_cast,就可以順利轉換了。

最後我想把f_儲存的類成員函式指標取出來進行呼叫,我們知道又要用到比較怪異的語法:

(p->*f)();

這個f就是我們取出來的成員函式指標:f = p->getf();

合起來就是:(p->*(p->getf()))(); 夠複雜吧?

類成員函式首先是乙個函式指標,這已經是一層間接性;然後它還是在類裡面,這又多了一層間接性,因此要通過類成員函式指標來呼叫成員函式,就必須提供物件的指標,還要提供成員函式的指標,所以它的使用還是蠻複雜的。

關於類成員函式指標,其實還有很多話題。例如boost裡面就有乙個function庫,對所有形式的函式,象靜態函式,類成員函式,函式物件等,提供了統一的介面,可以說是乙個泛型的函式型別。有時間希望能對它深入研究一下!

C 使用成員函式指標的乙個例子

進行單元測試,要測試乙個類的功能,下面這個測試類一共有三部分功能測試,每種測試分別在乙個函式中完成,然後可以通過鍵盤輸入控制測試模組是否執行。開始 寫成這樣 class pendulumtest void pendulumtest run void 感覺run函式的 太難看了,於是就使用成員函式指標...

C 類成員函式指標陣列應用 一

閱讀本文之前你需要明確知道函式指標和普通函式的區別,對這兩者本文不做過多說明 使用函式指標陣列建立一套bpm工作流框架。這套框架在各種oa以及某幾個大型通訊公司應用的很廣泛 多分枝 類似swtich 條件下 處理函式的形參列表和返回型別相同。如 int func1 const char pszcon...

C 乙個類呼叫另乙個類的成員變數 成員函式

有時候,兩個類之間並沒有繼承的關係,但是其中乙個類需要引用另乙個類中的成員變數或者成員函式。怎樣辦到呢?假設已經新建了兩個類a b。class a class b 現在需要在類a的成員函式中呼叫類b的成員變數b nadd b x,使得a nadd與b nadd相加,那麼只需要在類a的.cpp檔案中包...