关闭

类成员函数指针

433人阅读 评论(0) 收藏 举报

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

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1612次
    • 积分:41
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档