函数指针指向成员函数

我想建立一个函数指针作为一个类的成员,是一个指向另一个函数在同一个类的指针。 我这样做的原因很复杂。

在这个例子中,我想输出为“1”

class A { public: int f(); int (*x)(); } int A::f() { return 1; } int main() { A a; ax = af; printf("%d\n",ax()) } 

但是编译失败了。 为什么?

语法是错误的。 成员指针是与普通指针不同的类型类别。 成员指针必须与其类的对象一起使用:

 class A { public: int f(); int (A::*x)(); // <- declare by saying what class it is a pointer to }; int A::f() { return 1; } int main() { A a; ax = &A::f; // use the :: syntax printf("%d\n",(a.*(ax))()); // use together with an object of its class } 

ax还没有说什么对象的功能被呼吁。 它只是说你要使用存储在对象a的指针。 a另一个时间作为左操作数预先a.*运算符将告诉编译器调用该函数的对象。

int (*x)()不是指向成员函数的指针。 成员函数的指针是这样写的: int (A::*x)(void) = &A::f;

您需要使用指向成员函数的指针,而不仅仅是指向函数的指针。

 class A { int f() { return 1; } public: int (A::*x)(); A() : x(&A::f) {} }; int main() { A a; std::cout << (a.*ax)(); return 0; } 

在string命令中调用成员函数

 #include <iostream> #include <string> class A { public: void call(); private: void printH(); void command(std::string a, std::string b, void (A::*func)()); }; void A::printH() { std::cout<< "H\n"; } void A::call() { command("a","a", &A::printH); } void A::command(std::string a, std::string b, void (A::*func)()) { if(a == b) { (this->*func)(); } } int main() { A a; a.call(); return 0; } 

注意(this->*func)(); 以及用类名void (A::*func)()来声明函数指针的方法

虽然这是基于本页其他地方的英文答案,但我有一个用例并没有完全解决。 对于指向函数的向量,请执行以下操作:

 #include <iostream> #include <vector> #include <stdio.h> #include <stdlib.h> class A{ public: typedef vector<int> (A::*AFunc)(int I1,int I2); vector<AFunc> FuncList; inline int Subtract(int I1,int I2){return I1-I2;}; inline int Add(int I1,int I2){return I1+I2;}; ... void Populate(); void ExecuteAll(); }; void A::Populate(){ FuncList.push_back(&A::Subtract); FuncList.push_back(&A::Add); ... } void A::ExecuteAll(){ int In1=1,In2=2,Out=0; for(size_t FuncId=0;FuncId<FuncList.size();FuncId++){ Out=(this->*FuncList[FuncId])(In1,In2); printf("Function %ld output %d\n",FuncId,Out); } } int main(){ A Demo; Demo.Populate(); Demo.ExecuteAll(); return 0; } 

像这样的东西是有用的,如果你正在编写一个命令解释器索引函数,需要结合参数语法和帮助提示等可能也有用的菜单。