2013-05-09 55 views
1

對不起,提出這樣一個問題,因爲我確信它之前已經得到了答案,但我正在努力尋找答案,而不是爲了尋找答案。 ..反正..將一個非靜態方法指針作爲參數傳遞給另一個方法

class foo 
{ 
    void read(void (*func)(obj&)) 
    { 
     // many things happen to obj... 
     (*func)(obj); // Calls the function pointer to the handler. 
    } 

}; 
class bar : public foo 
{ 
    void handler(obj&) 
    { 
     // 
    } 
}; 

void main() 
{ 
    foo f; 

    typedef void (foo::*funcptr)(obj&); 
    funcptr ptr = &foo::handler; 

    f.read(ptr); ???? 
} 

因此,基本上,所有我想要做的就是通過所謂的處理程序作爲一個函數指針讀法,在非靜態成員方法,以便執行回調的情況下,處理程序被調用。

我試過各種各樣的方法來使這項工作,並不想讓靜態方法(因爲我不會進入)。我覺得我非常接近,但最後還是有點失敗!任何幫助,將不勝感激。

+1

查看常見問題簡介,他們有一個偉大的專門討論這個部分:http://www.parashift.com/c++-faq/pointers-to-members.html – Constantin 2013-05-09 01:51:33

回答

1

你不能這樣做:與可以獨立調用的靜態函數不同,成員函數的調用需要知道兩件事情 - 被調用的函數和調用它的對象。這就是爲什麼不可能將成員函數傳遞給需要「普通」函數指針的API。

如果您無權訪問foo類的源,則可以創建一個靜態函數,用於調用存儲在衆所周知位置(即靜態變量)中的對象上的成員函數。如果是這樣,請考慮將API更改爲一個函數對象,類似於標準C++庫中的函數。

最後,在C庫中有一個常用的方法,它使用函數指針 - 傳遞一個額外的void*指針,該指針將在調用時返回給函數指針; pthreads庫做到了。如果是這種情況,您可以創建一個包裝調用目標對象的struct,並將指向此struct的指針傳遞迴您的靜態函數。

0

AFAIK我認爲沒有其他辦法。您將不得不使該方法變爲靜態。

相關問題