2011-03-22 50 views
1

我已經做了樣品例如,在此我試圖傳遞一個函數作爲參數我得到錯誤C++中使用所需的函數指針,請你幫我幫助中

typedef void (*callbackptr)(int,int); 

class Myfirst 
{ 
public: 
    Myfirst(); 
    ~Myfirst(); 

    void add(int i,callbackptr ptr) 
    { 
     ptr(i,3); 
    } 

}; 

class Mysec 
{ 
public: 
    Myfirst first_ptr; 
    Mysec(); 
    ~Mysec(); 

    void TestCallback() 
    { 

     callbackptr pass_ptr = NULL; 
     pass_ptr = &Mysec::Testing; 
     first_ptr.add(2,&Mysec::Testing); 
    } 

    void Testing(int a,int b) 
    { 
     int c = a+b; 
    } 

}; 

回答

4

您作爲參數傳遞的回調函數的類型未定義爲類的一部分。您可能應該將Testing定義爲static

+0

請問您可以在我的代碼更新和轉發..因爲這是非常重要的,現在請我..​​. – Naruto 2011-03-22 06:16:10

+1

我明白了.. Thaks lot – Naruto 2011-03-22 06:19:07

+0

static void Testing(int a,int b); void MySec :: Testing(int a,int b)//在你的類之後聲明 int c = a + b; } – 2011-03-22 06:35:52

3

你是由於您指向成員函數而產生錯誤。指向成員函數的指針是不同的。見這裏: http://www.parashift.com/c++-faq-lite/pointers-to-members.html#faq-33.1

成員函數需要知道它使用的是哪個實例(this指針),因此它不能像其他函數一樣調用。如果您將回調函數從類中移出(或將其設置爲靜態,類似於將其從類中移出),那麼可以將它稱爲任何其他函數。

這樣做的更現代的方法是使用函子,例如,提高::功能和類似的boost ::綁定:

C++ Functors - and their uses

how boost::function and boost::bind work

那些可以隱藏成員和全局函數之間的區別。

0

您正試圖使用​​簡單的函數指針typedef訪問成員函數指針,這將不起作用。讓我解釋。

當您編寫普通的非成員函數(類似於C)時,函數的代碼實際上存在於函數名稱所指示的位置 - 您將傳遞給函數指針參數。

但是,在成員函數的情況下,你所擁有的只是類的定義;你還沒有在內存中分配的類的實際實例。在這樣的函數中,由於

this
指針尚未定義,因此對成員變量的任何引用都沒有意義,因爲編譯器沒有足夠的信息來解析其內存位置。實際上,成員函數指針並不是確切的地址;他們編碼的信息比那些更多(可能對您不可見)。欲瞭解更多,請閱讀 Pointers to Member Functions