suchen

Heim  >  Fragen und Antworten  >  Hauptteil

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 Tage vor439

Antworte allen(3)Ich werde antworten

  • PHP中文网

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

    所以这就是为什么stl有std::function。你声明一个function<void(void)>来代替函数指针,那么所有你能想得到的函数指针类型都可以放进去。如果是类成员函数,你还要把this指针给bind进去,然后就可以到处使用了。

    不要用裸的函数指针。C语言的函数指针类型在C++里面只能有两个作用:

    • 调用别的C语言编写的dll,你不得不使用函数指针

    • 用来实现std::function

    Antwort
    0
  • 大家讲道理

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

    因为非static的成员函数(例如你的Test类里的func1)的函数原型并不是void (*)()而是 void (Test::*)()
    对于非static成员函数,函数的“第0个参数”是包含一个Test*类型的指针,
    就像这样:

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

    这只是一个比喻,真正的函数签名不是这样的,目的是为了说明你不能把一个成员函数指针强转成一个非成员函数
    指针,而对于static成员函数,这个this指针是不存在的,所以是可以转换的。

    Antwort
    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指针一说的

    Antwort
    0
  • StornierenAntwort