类成员指针

类成员指针一般很少用到,使用类成员的指针与普通指针的区别在于,需要在类成员指针前面的加上类限定符,以指明是哪个类的成员指针。同样,在初始化指针时,也只能用相应类的相应类型的成员对指针进行初始化。

成员指针的应用举例
 
   当一个类有多个性质相同且类型相同的函数成员时,可以使用函数表来进行函数调用,产生用同一函数使用不同参数来达到不同操作的效果,而实际上是调用了不同的函数来实现的。下面给出这样的一个例子,方便读者有一个感性的认识:
#include <iostream>
using namespace std;

class Screen {
public:
    Screen& home() {
        cout << "Home" << endl;
        return *this;
    }
    Screen& forward() {
        cout << "Forward" << endl;
        return *this;
    }
    Screen& back() {
        cout << "Back" << endl;
        return *this;
    }
    Screen& up() {
        cout << "Up" << endl;
        return *this;
    }
    Screen& down() {
        cout << "down" << endl;
        return *this;
    }
    
// function table
    typedef Screen& (Screen:: *Action)();
    static Action Menu[];
    
// specify which direction to move
    enum Directions {HOME, FORWARD, BACK, UP, DOWN};
    Screen& move(Directions);
};

Screen::Action Screen::Menu[] = {&Screen::home, &Screen::forward, &Screen::back, &Screen::up, &Screen::down};

Screen& Screen::move(Directions dirc)
{
    (this->*Menu[dirc])();
    return *this;
}

int main()
{
    Screen sc;
    sc.move(Screen::HOME);
    sc.move(Screen::UP);
    return 0;
}
上面例子表明了类成员函数指针比较有优势的地方,可以扩展到用map代替上面的数组,实现高效的字符串和函数的绑定~~

另外由于类成员函数指针匹配条件非常严格,所以不建议用在比如线程入口函数等地方,往往会报不少错误。当然,如果符合下面三个条件也可以消除编译错误。

函数成员的指针与普通函数指针相比,也多了类限定符。由于类成员函数还有可能是const,所以const也成为成员函数指针声明的一部分。也就是说,函数成员的指针必须在三个方面与它所指函数的类型相匹配:

   (1)函数形参的类型和数目;
   (2)返回类型及是否为const函数;
   (3)所属类的类型。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值