类成员函数指针的基本用法:
1。声明:
已知简单的类声明如下:
class Screen
{
public:
Screen(int curson = 0): m_curson(curson){}
~Screen(){}
public:
Screen& forword(int num = 1) { m_curson += num; cout<<"forword called! "<<num<<endl; return *this;}
Screen& back(int num = 1) { m_curson -= num; cout<<"back called! "<<num<<endl; return *this;}
private:
unsigned int m_curson;
};
我们可以这样声明一个指向back成员函数的指针:
Screen& (Screen::*back_fun)(int para) = &Screen::back;
其中:
Screen& -函数返回值; int para-函数参数; back_fun - 函数指针名称;
&Screen::back - 类Screen成员函数back的地址
Screen::* 表示该指针是指向类Screen的函数成员指针
2. 使用方法也比较简单:
#include "screen.h"
Screen& (Screen::*back_fun)(int para) = &Screen::back;
void main()
{
Screen myscreen, *pscreen; //注意:myscreen是类对象, 而pscreen是类指针
pscreen = &myscreen;
(myscreen.*back_fun)(10) ;
(pscreen->*back_fun)(20);
}
说明: 类成员函数指针的调用有两只方式:类对象+(. *) 和 类指针+(->*) 其中*不可缺少
3。实际操作
类成员函数指针使用情况之一就是类中有多个并列的operaitons, 为了调用的方便,并实现信息隐藏我们使用类成员指针数组来实现。如下例:
#include <iostream>
using namespace std;
#pragma warning (once: 4514)
class Screen
{
typedef Screen& (Screen::*Action)(int);
public:
enum move_enum{forword_dir, backword_dir, moves};
static Action actions[moves];
public:
Screen(int curson = 0): m_curson(curson){}
~Screen(){}
public:
Screen& move(move_enum dir, int para, int num)
{
for (int i = 0; i < num; ++i)
(this->*actions[dir])(para);
return *this;
}
private: //实现接口隐藏
Screen& forword(int num = 1) { m_curson += num; cout<<"forword called! "<<num<<endl; return *this;}
Screen& back(int num = 1) { m_curson -= num; cout<<"back called! "<<num<<endl; return *this;}
private:
unsigned int m_curson;
};
Screen::Action Screen::actions[moves] = {&Screen::forword, &Screen::back};
void main()
{
Screen myscreen;
Screen* pScreen = & myscreen;
myscreen.move(Screen::backword_dir, 5, 10);
return;
}
从类设计的角度来说,screen类可能再增加诸如up, home等成员函数,但是我们外部使用接口myscreen.move 并不需要改变,这个外部接口是统一的,实现类访问接口简单化。以后维护代码时每增加一个move动作,我们需要做的工作是:
1)。添加 move_enum
2)。添加 actions[]
3)。定义 move_new