2010-10-01 105 views
2

我還不是很熟悉這些,但也許有人可以照亮這個例子。使用函數指針?

想象一下,我有CFoo類,它將有一個函數來添加一個處理函數和一個函數指針函數。

因此,像這樣:

class CFoo { 

int *pointedFunc(int a, int b) = 0; 

void setFunc(int *func(int a, int b)) 
{ 
    pointedFunc = func; 
} 
}; 

鑑於上述背景下,我想知道這樣做的正確方法。我認爲我沒有做好。另外,我將如何去調用pointedFunc?

感謝

+1

不是作爲函數指針的「a *函數*」,而是作爲函數指針的「a *成員變量*(在OO中稱爲a *字段*)」。 – 2010-10-01 00:39:45

+0

請避免使用C++代碼中的函數指針。定義一個接口並創建實現該接口的類型。然後您可以整齊地存儲對象,而不必訴諸函數指針的C hocks-pockus。 – 2010-10-01 01:04:00

+0

@Martin:有時一個接口是正確的方法,有時候模板化(和鴨子類型)仿函數,有時函數指針是最好的。特別是對於動態鏈接,需要函數指針。 – 2010-10-01 05:20:41

回答

8

現在你有一個成員函數返回int *,而不是返回int函數的指針。一組括號可以解決這個問題。

int (*pointedFunc)(int a, int b); 

void setFunc(int (*pfunc)(int a, int b)) 
{ 
    pointedFunc = pfunc; 
} 

此外,成員變量初始化得到在構造函數中構造函數初始化程序列表,像

CFoo::CFoo() : pointedFunc(0) {} 

不喜歡你做。你的= 0實際上是一個純粹的說明符(除非成員函數是虛擬的,否則它是行不通的),當你修正指針返回類型與指向函數的問題時,你會發現編譯器也會抱怨你嘗試初始化它。

Using a typedef as Graeme suggests是跟蹤函數指針類型的最簡單也是最好的方法。

+0

噢,謝謝,我不知道它只是用於虛函數 – jmasterx 2010-10-01 00:39:09

+0

它不僅僅是用於虛擬函數,因爲'= 0'意思是**完全不同的**(提示Monty Python),當它出現在函數聲明,就像它出現在數據聲明中一樣。實際上,'int(* poinFunc)(int a,int b)= 0;'完全可以作爲局部變量,它可以被初始化,但是成員變量會在構造函數中初始化,而不是在聲明中初始化。 – 2010-10-01 00:42:10

+0

雖然你肯定設置一個函數本身= 0是一個純粹的說明符,但我覺得你可以設置一個函數*指針*爲NULL而不會出現問題,我相信這是最初的意圖。 – Bryan 2010-10-01 00:45:04

3

在你的榜樣,pointedFunc是一個成員函數返回一個int *。爲了使一個函數指針,你需要大約pointedFunc括號,如:

int (*pointedFunc)(int a, int b); 

一個類型定義可能更清楚:

class CFoo { 
    CFoo() : pointedFunc(NULL) {} 
    typedef int (*funcType)(int, int); 
    funcType pointedFunc; 

    void setFunc(funcType f) { 
     pointedFunc = f; 
    } 
}; 

調用的函數,你可以使用pointedFunc(1, 2)(*pointedFunc)(1, 2)。我傾向於使用後者來說明你正在經歷一個函數指針,但是兩者都可以工作。

+2

不,這不好,現在他有一個名爲'pointedFunc'的成員函數,返回類型是'int *'。 – 2010-10-01 00:34:15

+0

好吧,謝謝,我想我缺乏自信:p – jmasterx 2010-10-01 00:35:41

+0

@Ben:你是對的 - 感謝您的澄清。我已經解決了我的答案。 – 2010-10-01 00:38:26