2012-03-05 45 views
1

我有下面的代碼:傳遞extern函數作爲參數的最好和安全的方法是沒有提升的類的函數?

#include <iostream> 

typedef void (*FuncPtr)(int); 

extern void MyFunc(FuncPtr callback)  

class MyClass 
{ 
public: 
    void SomeFunction(int n) 
    { 
     std::cout << "bla: " << n << std::endl; 
    } 
}; 

int main() 
{ 
    MyClass obj; 
    MyFunc(/* */); 
} 

什麼是MyFunc功能作爲參數傳遞類無(SomeFunction)升壓功能的最佳和安全的方式是什麼?

+1

http://www.parashift.com/c++-faq-lite/pointers-to-members.html – 2012-03-05 21:03:09

+1

將'SomeFunction'聲明爲'static' 。 – 2012-03-05 21:04:41

+0

問題:「如何將成員函數的指針作爲函數參數傳遞」? – 2012-03-05 21:07:21

回答

2

你不能,即使你的編譯器允許它,我相信你會進入未定義的行爲。

SomeFunction是不是一個免費的功能,它是一個成員函數。這意味着它在一個對象上運行,所以在上下文之外調用它是一個可靠的途徑。

2

對於C回調成語是包括用戶數據其中通過功能並返回到回調傳遞一個任意參數:

typedef void (*FuncPtr)(int, uintptr_t user_data); 

extern void MyFunc(FuncPtr callback, uintptr_t user_data); 

當調用一個方法上的類與您使用的一個回調user_data傳遞this指針:

class MyClass 
{ 
public: 
    void SomeFunction(int n) 
    { 
     std::cout << "bla: " << n << std::endl; 
    } 
private: 
    static void SomeFunctionEntry(int n, uintptr_t user_data) 
    { 
     MyClass *ths = (MyClass *) user_data; 
     ths->SomeFunction(n); 
    } 
}; 

靜態功能SomeFunctionEntry是一個免費的功能,其可以被調用作爲callba CK。您保證其user_data參數是一個有效的類的實例:

int main() 
{ 
    MyClass obj; 
    MyFunc(&MyClass::SomeFunctionEntry, (uintptr_t) &obj); 
} 

(邊注:這是一個非常糟糕的主意通過自動變量像obj作爲回調在多線程環境,因爲它是很難做到確保指針在最終調用回調時仍然有效)

+0

+1完整的答案,即使是經典的「非常糟糕的主意」在那裏:) – 2012-03-05 21:22:06

相關問題