2012-01-27 49 views
1

現在如何處理一個類的函數指針到另一個類的函數?這是我的問題爲什麼我不能用這個其他類的函數填充這個類的函數指針

例子:

class Apple 
{ 
    int(Apple::*pActionFunc)(void); 
}; 

class Tree 
{ 
    Apple* tempy; 

    void Init(void); 

    int I_Work(void); 
}; 

void Tree::Init(void) 
{ 
    tempy = new Apple(); 
    tempy->pActionFunc = &Tree::I_Work; 
} 

int Tree::I_Work(void) 
{ 
    "Do Things" 
} 

這是行不通的。這是爲什麼?

+1

爲什麼在使用函數或接口時使用函數指針? – AlexTheo 2012-01-27 15:07:47

+0

http://blogs.msdn.com/b/oldnewthing/archive/2004/02/09/70002.aspx這是一個很好的關於方法指針的閱讀。無論如何,享受並希望它可以幫助 – Nico 2012-01-27 15:04:24

回答

5

這不起作用,因爲就像所有變量函數指針也有一個類型一樣,並且只能使用指向相同類型的指針來存儲變量類型的地址。

int(Apple::*pActionFunc)(void); 

告訴編譯器pActionFunc是指向Apple類這需要void作爲參數並返回int的成員函數。

tempy->pActionFunc = &Tree::I_Work; 

試圖存儲的功能I_Work()Tree類的這需要void作爲輸入參數,返回一個int的成員的地址。

如果您發現它們是不同類別的成員函數,並因此出現錯誤。

+0

我可以做這個工作?我所需要的只是第一個能夠容納連接到第二類功能的函數指針的第一個classto – 2012-01-27 16:26:14

1
void foo(int); 
void (*pfunc)(double); 
pfunc = foo;   // This is an error 

爲什麼這是一個錯誤?由於pfunc採用與foo不同的參數。這與此處發生的事情是一樣的。看起來Tree::I_Work是一個函數,它不接受任何參數並返回一個int,所以它應該與來自Apple的不帶參數並返回int的函數兼容。但事實並非如此。你不能這樣稱呼I_Work:

x = I_Work(); 

你能嗎?不需要你需要一個Tree對象。

a_tree.I_Work(); 

這應該告訴你,成員函數與自由函數有根本的區別。成員函數有一個隱藏的參數。實際上,它並沒有真正隱藏,它只是在一個不同的位置。它位於函數名稱的左側,而不是括號內。因此,總而言之,不能將一個類的成員函數指針指派給另一個類的成員函數,因爲即使它們看起來它們不具有相同的參數。

0

除了什麼阿爾斯說,你不能分配如下:

tempy->pActionFunc = &Tree::I_Work; 

由於I_Work有一個隱this指針作爲參數,因此參數列表是不一樣的。

0

每個成員函數都有一個不可見的this參數,它是函數簽名的一部分。當你寫:

int(Apple::*pActionFunc)(void); 

內部編譯器將其視爲:

int(*pActionFunc)(Apple* this); 

你試圖插入到指針的函數具有以下簽名相當於:

int I_Work(Tree* this); 

簽名不匹配。

相關問題