【问题标题】:Using function pointer from another class使用另一个类的函数指针
【发布时间】:2015-05-14 13:51:11
【问题描述】:

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

【问题讨论】:

  • (classobject2.*classobject2.genericfunc)();
  • 它有效;如果你想让它成为答案,我会接受。顺便说一句,我看起来很奇怪,但我在这里很绿..
  • 您正在通过对象访问成员,而不是指针。
  • 所以使用 (classobject2.*genericfunc)() ;

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


【解决方案1】:

与点 . 和箭头 -&gt; 不同,指向成员的指针 运算符 - .*-&gt;* - 不要用作类成员访问运算符,这意味着它们可以不要缩小查找后面的 id 表达式的范围。您首先需要访问一个保存指针本身的数据成员:

classobject2.genericfunc

然后才应用 指向成员运算符的指针

(classobject2.*classobject2.genericfunc)();

等同于:

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

形式的表达:

(this->*genericfunc)();

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

另外,请记住.* 适用于类类型的第一个操作数,而-&gt;* 期望它是一个指向类类型的指针

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-25
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多