簡體   English   中英

指向成員函數的指針,作為全局函數的參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM