C++类的成员函数指针

        对于一般的函数指针我们都比较了解了,而类的成员函数指针以及调用方式都有所不同。博主在调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!

发表评论