通过指针调用成员函数

C++: Calling member function via pointer

本文关键字:成员 函数 调用 指针      更新时间:2023-10-16

我有这个使用指针成员函数的示例代码,我想在运行时更改,但我不能使其工作。我已经试过this->*_currentPtr(4,5), (*this)._currentPtr(4, 5)了。在同一个类中调用方法指针的正确方法是什么?

表达式必须具有(pointer-to-)函数类型
#include <iostream>
#include <cstdlib>
class A {
public:
    void setPtr(int v);
    void useFoo();
private:
    typedef int (A::*fooPtr)(int a, int b);
    fooPtr _currentPtr;
    int foo1(int a, int b);
    int foo2(int a, int b);
};
void A::setPtr(int v){
    if(v == 1){
        _currentPtr = foo1;
    } else {
        _currentPtr = foo2;
    }
}
void A::useFoo(){
    //std::cout << this->*_currentPtr(4,5); // ERROR
}
int A::foo1(int a, int b){
    return a - b;
}
int A::foo2(int a, int b){
    return a + b;
}
int main(){
    A obj;
    obj.setPtr(1);
    obj.useFoo();
    return 0;
}

你需要告诉编译器foo来自哪个类(否则它会认为它们是全局作用域的函数):

void A::setPtr(int v){
    if(v == 1){
        _currentPtr = &A::foo1;
                  //  ^^^^
    } else {
        _currentPtr = &A::foo2;
                  //  ^^^^
    }
}

这里需要一组括号

std::cout << (this->*_currentPtr)(4,5);
          // ^                  ^