搜尋

首頁  >  問答  >  主體

C++的类中怎么使用函数指针数组呢?

我只知道这样一种,请知道的补充。
还请大牛解释一下为什么要加static

class Test
{
    private:
        typedef void(*func)(void);
        func funcPtr[2];
        

        
   public:
        Test();
        ~Test();
        static void func1(void);
        static void func2(void);
};
Test::Test()
{
    funcPtr[0] = func1;
    funcPtr[1] = func2
}
void Test::func1(void) {}
void Test::func2(void) {}
...
黄舟黄舟2803 天前440

全部回覆(3)我來回復

  • PHP中文网

    PHP中文网2017-04-17 13:20:50

    所以這就是為什麼stl有std::function。你宣告一個function<void(void)>來代替函數指針,那麼所有你能想得到的函數指針類型都可以放進去。如果是類別成員函數,你還要把this指標給bind進去,然後就可以到處使用了。

    不要用裸的函數指標。 C語言的函式指標型別在C++裡面只能有兩個作用:

    • 呼叫別的C語言寫的dll,你只好用函數指標

    • 用來實現std::function

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 13:20:50

    因為非static的成員函數(例如你的Test類別裡的func1)的函數原型並不是void (*)()而是void (Test::*)()
    對於非static成員函數,函數的「第0個參數」是包含一個Test*類型的指針,
    就像這樣:

     void func(Test* this, .../*some arguments*/)

    這只是一個比喻,真正的函數簽名不是這樣的,目的是為了說明你不能把一個成員函數指針強轉成一個非成員函數
    指針,而對於static成員函數,這個this指針是不存在的,所以是可以轉換的。

    回覆
    0
  • 怪我咯

    怪我咯2017-04-17 13:20:50

    #include <iostream>
    #include <stdio.h>
    using namespace std;
    
    class Test
    {
    private:
        typedef void(Test::*foo)();
        foo a[2];
    public:
        Test(){
            a[0] = &Test::func1;
            a[1] = &Test::func2;
            (this->*a[0])();
            (this->*a[1])();
        }
        void func1(){
            printf("func1 %p\n", this);
        }
        void func2(void){
            printf("func2 %p\n", this);
        }
    };
    
    int main(){
        Test t1;
        Test t2;
        return 0;
    }
    

    static表示類別的修飾,用了static之後,方法呼叫時需要用類別的名字空間修飾,但方法本身跟著全域方法是等價的。輸出
    func1 0x7ffddf3b3820
    func2 0x7ffddf3b3820
    func1 0x7ffddf3b3840
    func2 0x7ffddf3b3840
    可見,方法是被綁定在每個對像上的,用static修飾的函數是沒有this指針一說的

    回覆
    0
  • 取消回覆