类成员函数指针

类成员函数指针的基本用法:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值