2012-08-09 119 views
1

我是新來的函數指針,我想你的幫助。 我有一個方法:在另一種方法(不是主要的)我做函數指針 - 編譯時間錯誤

int test3(int i) 
{ 
    return i; 
} 

然後:

int (*pTest3)(int) = test3; 

從我讀這似乎確定的例子。 不過,我得到一個編譯時錯誤:

testFile.cpp:277:25: error: argument of type ‘int ({anonymous}::CheckingConsumer::)(int)’ does not match ‘int (*)(int)’

我不明白什麼是錯的。任何幫助,將不勝感激。

非常感謝。

+3

函數是一個類成員函數嗎?這個錯誤似乎表明它是....如果你想創建一個成員函數指針,它有點不同。 – jcoder 2012-08-09 14:59:54

+1

它沒有問題。從你的文件的大小(至少277行)來看,還有其他可能導致這種情況的東西('CheckingConsumer'?),你上面沒有提到。 – 2012-08-09 15:04:07

+2

如果在你的問題中可以包含一個*完整的*,但顯示你的問題的最簡單的例子將是有幫助的。在這裏,我們必須仔細閱讀各行,以推斷'test3'確實是'CheckingConsumer'的成員,這使得問題難以回答。 – Flexo 2012-08-09 15:04:51

回答

6

您的test3structclass的成員函數。類成員函數有一個隱藏的this參數傳遞給它們,所以不能與純函數指針一起使用。您需要定義這樣兩個功能爲static或移動它的struct/class之外,因此它不再有一個隱藏this參數,或者使用一個類方法的指針,而不是一個函數指針:

// static class method: 
class X 
{ 
    static int test3(int i) 
    { 
     ... 
    } 
}; 

// Non-class method, at global scope 
int test3(int i) 
{ 
    ... 
} 

// Class method pointer 
class X 
{ 
    int test3(int i) 
    { 
     ... 
    } 
}; 

// Create the method pointer 
int (X::*pTest3) = &X::test3; 
X *obj; 
// Call the method pointer on an object 
(obj ->* pTest3)(42); 
+0

非常感謝回覆。它使用static關鍵字。但是,這是否會影響程序呢? – Soc 2012-08-09 15:18:26

+0

@ user1491620'static'使得它不適用於您班級的實例,這會顯着改變其意義。 – Flexo 2012-08-09 15:32:04

0

你的方法test3似乎是一種實例方法。稍後,您將pTest3定義爲函數指針,而不是成員函數指針。

簡單指針和成員指針之間的主要區別是使用成員指針需要對象的一個​​實例。該對象的一個​​實例告訴應該處理哪個對象,並且該指針的值告訴應該使用該對象的哪個數據字段或應該調用哪個成員函數。成員指針的值在概念上等同於從對象開始到其成員的偏移量。

使用的typedef聲明的成員指針:

typedef int (SomeClass::*MyMethodPtr)(int i); 
MyMethodPtr ptr3 = SomeClass::test3; 

現在用這個指針:

class SomeClass *pab = &ab; 
int ret_value = (pab->*ptr3)(4); 

注意的類的實例被使用。關於成員指針還有其他重要的一點。它們被實現爲包含2到5個簡單指針和偏移量的結構,這取決於編譯器和其他方面,如多重繼承,虛擬基類的存在等。