使用另一个 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.cpp
和 g++ 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
我有一个 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.cpp
和 g++ 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