使用来自另一个类的函数指针

时间:2015-05-14 13:51:12

标签: c++ class object constructor function-pointers

我有一个包含函数指针的类,它将根据构造函数输入指向不同的函数。当我使用类中函数的函数指针时,这可以工作,但是当我尝试从另一个类中构造的对象中使用它时,我遇到了麻烦。这里要说明的是类标题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

和班级来源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)();

1 个答案:

答案 0 :(得分:2)

与点.和箭头->相反,指向成员运算符的指针 - .*->* - 不要提供服务作为类成员访问操作符,这意味着它们不会缩小查找后面的id-expression的范围。首先需要访问一个包含指针本身的数据成员:

classobject2.genericfunc

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

(classobject2.*classobject2.genericfunc)();

与:

相同
(classobject2.*(classobject2.genericfunc))();

表格的表达方式:

(this->*genericfunc)();

有效,因为名称genericfunc出现在成员函数的主体中,所以它在封闭类的范围内查找。

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

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