指向成员函数的函数指针

首先看一个指向成员函数的函数指针的例子,比较常用,代码如下:

    class A {
    public:
        void func() {
            cout << "func" << endl;
        }
    };
    int main(int argc, char * argv[]) {
        void (A::pf)() = &A::func;
        A a;
        (a.*pf)();
        return 0;
    }

可以看到,定义指向类A的成员函数A::func()的函数指针定义pf的格式必须带上A::,给pf赋值不能使用对象a的func赋值,而必须使用A::,且必须加上&(普通的c函数是可以不加&的).
使用&a.func对pf赋值时,我使用g++编译,给出的错误提示很明确易懂:
错误: ISO C++ 不允许通过取已绑定的成员函数的地址来构造成员函数指针。请改用‘&A::funcB’ [-fpermissive]

ps: 网上有人说clang给出的提示更好,但现在测试出来clang给出的提示很模糊:
error: cannot create a non-constant pointer to member function
p = &a.funcB;
^~~~~~~~
g++给出错误位置是多少行多少列,clang则是用波浪线标出来的.

类成员为函数指针

    class A {
    public:
        void (*pq)();
    };
    void func() {
        cout << "func " << endl;
    }
    int main(int argc, char * argv[]) {
        A a;
        a.pq = func;
        a.pq();
        return 0;
    }

这个例子也验证了第一个例子所说的,c函数指针赋值是不用加&的. 这个例子学习C语言的时候就见过了,写出来只是为了过度到第三个更加复杂例子的.

类成员函数指针指向类成员

    class A {
    public:
        void func() {
            cout << "func " << endl;
        }
        void (A::*p)();  //  必须加A::
        A () { // 更加但痛的调用方式
            p = &A::func; // 必须加A::
            (this->*p)();
        }
    };
    int main(int argc, char * argv[]) {
        A a;
        a.p = &A::func;
        (a.*(a.p))(); // 和第一个例子有点像,使用a.p替换pf就是了.
        return 0;
    }

首先是函数指针的定义,指向自己所在类的成员函数,定义的时候必须加A::前缀.然后在给p赋值的时候必须和第一个例子一样加A::(成员函数内部使用也不例外).然后就是使用p的时候.在成员函数内部使用(this->p)();.在A的对象中使用(a.(a.p))();的方式.

函数指针的作用就是为了实现多态吧.下面是我的全部测试代码.在gcc4.7,clang3.0测试通过.没在网上找啥资料,全靠编译器的错误提示完成这段代码,错误之处还望读者提出来.

分享到 --

欢迎转载,转载请注明作者及出处oldblog.hanxi.info,请勿用于商业用途

本文地址:http://hanxi.github.io/2013/09/01/original-cpp-point-to-member-function