使用另一个 class 的函数指针

Using function pointer from another class

我有一个 class 包含一个函数指针,它会根据构造函数的输入指向不同的函数。当我从 class 中的函数使用函数指针时,这是有效的,但是当我尝试从另一个 class 中构造的 object 使用它时,我 运行 遇到了麻烦。这里要说明的是 class header myclass.h:

using namespace std;
#include <cstdlib> 
#include <iostream>  

#ifndef MYCLASS_H
#define MYCLASS_H

class myclass{

    public: 

    void (myclass::*genericfunc)();
    void specialfunc1();
    void specialfunc2();
    void rungeneric();

    myclass(int fno) {
        if(fno==1) genericfunc=&myclass::specialfunc1;
        else if(fno==2) genericfunc=&myclass::specialfunc2;
        else {
            cerr << "ERROR: myclass must be constructed with integer input 1 or 2" << endl;
            throw std::exception();
        }
    }
};

#endif

和 class 来源 myclass.cpp

#include "myclass.h"

void myclass::specialfunc1() {cout << "Running function 1" << endl;}

void myclass::specialfunc2() {cout << "Running function 2" << endl;}

void myclass::rungeneric() {

    (this->*genericfunc)();

}

最后是程序 testmyclass.cpp:

using namespace std;
#include "myclass.h"

int main() {

    myclass classobject1(1);
    classobject1.rungeneric();

    myclass classobject2(2);
    (classobject2->*genericfunc)();

}

我使用 g++ -c myclass.cppg++ testmyclass.cpp myclass.o -o testmyclass 进行编译。编译问题出现在main函数的最后一行:

testmyclass.cpp: In function ‘int main()’:
testmyclass.cpp:14:18: error: ‘genericfunc’ was not declared in this scope
  (classobject2->*genericfunc)();

与点 . 和箭头 -> 相反, 指向成员 运算符的指针 - .*->* - 不要't 用作 class 成员访问运算符,这意味着它们不会缩小查找后面的 id 表达式的范围。您首先需要访问一个包含指针本身的数据成员:

classobject2.genericfunc

然后才将指针应用到成员运算符:

(classobject2.*classobject2.genericfunc)();

等同于:

(classobject2.*(classobject2.genericfunc))();

形式表达:

(this->*genericfunc)();

有效,因为名称 genericfunc 出现在成员函数的主体中,所以它在封闭的 class.

的范围内查找

此外,请记住 .* 适用于 class 类型的第一个操作数,而 ->* 期望它是 指向class 类型:

    (&classobject2->*classobject2.genericfunc)();
//   ^ address    ^^^ arrow