2011-07-18 39 views
2

給大家帶來歡樂!我有一個函數指針的方法如何將指針方法的某些類轉換爲指針函數?

int Myclass::*myMethod(char* a,char* b){ 
    //some code 
} 

,並嘗試運行它

bool Myclass::myMethod2(){ 
    AnotherClass *instance = AnotherClass:getInstance(); 
    instance-> addParams(&myMethod); 
    return true; 
} 

AnotherClass - 這個類中的另一個DLL。 AnotherClass definition

class AnotherClass 
{ 
    //friend class Myclass; 
public: 
    static AnotherClass* getInstance(); 
    void addParams(int (*myMethod)(char*, char*) =0); 
     //I try so void addParams(int (Myclass::*myMethod)(char*, char*) =0); 
}; 

並且有錯誤C2664。無法將參數1從'int Myclass :: *(__cdecl *)(char *,char *)'轉換爲int(__cdecl *)(char *,char *)。

嗯..我該怎麼辦?

+4

這是不可能的一個成員函數指針轉換爲非成員函數指針。你真的想在這裏做什麼?可能有更好的方法來做你想做的事。 –

+0

'AnotherClass'看起來設計得很差,因爲它只需要一個函數指針,沒有上下文屬於調用者。你的調用者顯然希望提供一些上下文(當在Myclass的特定實例上調用一個非靜態成員函數MyMethod時,你需要指向'this'的東西)。 C風格的回調接口通常有一個用戶數據指針,在C++中你可以做同樣的事情,或者使用多態。根據dll邊界的重要性,你可以使'addParams'成爲一個模板。 –

+0

[禁用「壞功能投射」警告]的可能的重複(http://stackoverflow.com/questions/6676764/disabling-bad-function-cast-warning) – iammilind

回答

2

你不能。

addParams()方法需要一個接受兩個char*參數的函數。

Myclass::myMethod接受兩個char*參數Myclass對象

沒有辦法使兩者兼容。

2

編輯:我誤解了你的問題,並沒有注意到關於DLL的一點 - 但是如果你有對DLL的控制,並且有修改它的願望,那麼1和3仍然適用。如果不是的話,你所能做的只是第二。


在這種情況下,有三件事情可以做:

一,改變方式您AnotherClass通過聲明addParams像這樣設計的:

void addParams(int (Myclass::*)(char*, char*) =0); 

兩個,你可以讓Myclass::myMethod()一個靜態成員,然後您的原始聲明addParams將工作。

三,你可以使用一個像庫提振綁定的方法如下:

bool Myclass::myMethod2(){ 
    AnotherClass *instance = AnotherClass:getInstance(); 
    instance-> addParams(boost::bind(&Myclass::myMethod, this)); 
    return true; 
} 

class AnotherClass 
{ 
    //... 
    void addParams(boost::function<int(char*, char*)>); 
}; 
+0

我選擇第二。是工作。謝謝!! – Stepchik

0

你從對象的實例中調用方法。 (假設MYCLASS :: myMethod2()不是靜態)

你可以從這個調用方法:

instance-> addParams(&(this->myMethod)); 
相關問題