簡體   English   中英

C ++:指向另一個類函數的函數指針

[英]C++: Function pointer to another class function

我有2節課

class B {
public:
    int func(int i);
};

class A {
public:
    typedef int (B::*fPtr)(int);
    void run();
    B* mB;
};

void A::run() {
    // create a pointer
    fPtr p = &(B::func);
    // invoke the function
    mB->*p(2);     <------- Compilation Error
}

我需要的是在A的運行函數中創建一個指向func()的指針。 我得到一個編譯錯誤,說mB不對應於帶有1個參數的函數。

請幫忙

你需要在函數表達式周圍加上括號:

(mB->*p)(2);

但正如其他人所指出的那樣,幾乎可以肯定有更好的方法來做你想要做的事情。

類的實例方法總是為this指針隱藏第一個參數,因此它與函數指針typedef不兼容。 無法直接獲取指向成員函數的指針。 典型的解決方法是使用“thunk”,在其中傳遞一個靜態函數,該函數接受通用的“catch all”參數(例如void * ),該參數可以靜態地轉換為您可以調用成員函數的指針。 例:

class B
{
public:
    static void MyThunk(void * obj)
    {
        static_cast<B *>(obj)->MyRealFunc();
    }

    void MyRealFunc()
    {
        // do something here
    }

    // . . .
};

您可以輕松獲得指向靜態函數的指針,因為它沒有“隱藏this ”,只需使用B::MyThunk引用它。 如果您的函數需要其他參數,您可以使用仿函數之類的東西來捕獲必要的參數和狀態。

你一定要閱讀這個C ++ FAQ Lite頁面,它會告訴你更多關於這一切的信息: 指向成員函數的指針

為什么你不能調用mB->func(2);

如果你需要B的不同函數,也許可以查看virtual函數和類繼承

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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