对于一般的函数指针我们都比较了解了,而类的成员函数指针以及调用方式都有所不同。博主在调Bug的过程中,将相关资料整理到这篇博客中,仅供参考。
首先,函数指针大家一般喜欢用 typedef 先定义出类型,然后用该类型继续定义变量,当然函数指针也可以直接定义:
/*先萃取类型*/ typedef bool(*Func)(int, int); Func func; ... func(1, 2) == true; /*直接定义*/ bool(*func)(int, int); ... func(1,2) == true;
一般的函数指针都向上面那样就可以了,但是,在类内部定义一个函数指针,要再内部或外部进行调用,操作都会有所不同,这是StackOverFlow对某个函数指针调用问题的解释。如果不按照这种方式调用,会出现 expression preceding parentheses of apparent call must have (pointer-to-) function type 编译错误。
定义也要在 * 之前加上类名,于是定义和调用的完整过程就是:
class C{ bool(C::*ptr)(int, int); ... } //类内部调用 this->*ptr(0,0); //类外部调用 C *a = new C; (a->*(a->foo))();
为什么在类外部调用需要这么写呢?刚刚那个StackOverFlow上写的很清楚:
(a->*X)(...)
– dereferences a member function pointer – the parens around a->*X
are important for precedence.
类的成员函数指针在有些编译器中不会报错,但是我们依然需要遵守标准和规则。
OK,See You Next Chapter!