2016-05-15 86 views
1

我有使用Borland C++編譯器在Eclipse,我想一個成員函數的地址傳遞給另一個類的構造函數是第一類的朋友問題C++通過構件函數作爲另一個的成員函數的參數

PCB::PCB(Thread *t, long stack, int time, void (*method)()) 

我使用的方法找到FP_SEGFP_OFF,但它給我的錯誤,當我寫

Thread::Thread (StackSize stackSize, Time timeSlice){ 
    myPCB = new PCB(this, stackSize, timeSlice, run); 
} 

這是錯誤,我讓所有的時間:

找不到函數線程一次比賽爲 'PCB :: PCB(螺紋* const的無符號長,無符號整型,無效)' ::線程(無符號長,無符號整型)

+0

'void(* method)()'不是成員函數指針。 –

+0

但是,當我添加(Thread :: *方法)FP_OFF(方法)不起作用 – Brana

+0

我建議閱讀此答案http://stackoverflow.com/a/7218633/5404527 – o9000

回答

4

雖然成員函數調用看起來像是一個常規的函數調用,但兩者並不相同,因爲在將指針傳遞給被調用的函數時存在編譯器技巧。當您從另一個成員函數調用成員函數時,C++會爲您填充this指針。這就是爲什麼成員函數與常規函數不兼容,只有靜態函數。

如果您需要將函數傳遞給您未寫入的API,則需要傳遞常規函數。否則,請考慮更改代碼以代替std::function,因爲它與成員函數兼容。

有時,第三方C風格的API支持爲呼叫的「上下文」傳遞額外的參數。如果您的API也支持void*,那麼您可以編寫一個常規函數,該函數將一個void指針轉換回您的類的實例,並在該實例上調用成員函數。

相關問題