![](/img/trans.png)
[英]Passing a pointer to a member function as argument for a void* function
[英]Pointer to member function for as argument for global function
有這樣的代碼:
void foo(void (*fun_ptr)()){
}
class B{
public:
B(){
foo(some_fun);
}
void some_fun(){}
};
編譯錯誤:
error: argument of type ‘void (B::)()’ does not match ‘void (*)()’
在這種情況下如何指向成員函數? 我無法改變函數foo的聲明,只有B類!
聲明B::some_fun()
為static
因為有一個隱式this
指針作為參數傳遞給成員函數。 需要注意的是使B::some_fun()
靜態阻止訪問非公開非靜態成員B
。
這是一個常見問題解答。
除了將成員函數包裝在靜態函數中之外沒有其他解決方案,並以某種方式告訴它關於調用方法的對象實例:
struct X { void foo(); }
void take_callback(void (*fun_ptr)())
{
fun_ptr(); // invoke callback
}
//wrap the method
X* instance = 0;
void wrap_memberfun()
{
if (instance) instance->foo(); // delegate
}
int main()
{
X x;
take_callback(&X::foo); // doesn't compile
// workaround:
instance = &x;
take_callback(&wrap_memberfun);
}
some_fun()是一個成員函數,需要一個對象。 使some_fun()靜態。
static void some_fun() {};
要調用非靜態成員函數,您需要兩個指針(函數和類實例),因此您無法真正使用指向非預期指向函數的非靜態成員的指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.