gpt4 book ai didi

c++ - 使用另一个类的函数指针

转载 作者:行者123 更新时间:2023-11-30 03:53:12 29 4
gpt4 key购买 nike

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

最佳答案

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

classobject2.genericfunc

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

(classobject2.*classobject2.genericfunc)();

这与:

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

形式的表达:

(this->*genericfunc)();

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

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

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

关于c++ - 使用另一个类的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30239131/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com