关闭

成员函数指针表

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

函数指针和成员函数指针的一个公共用途是,将它们存储在函数表中。函数表是函数指针的集合,在运行时从中选择给定调用。

对具有几个相同类型成员的类而言,可以使用这样的表来从这些成员的集合中选择一个。假定扩展screen类以包含几个成员函数,其中每一个在特定方向移动光标:

class Screen
{
public:
	//other interface and implementation members as before
	//same type of functions for cursor movement, can be integrated into member function pointer array.
	Screen &   home();
	Screen &	 forward();
	Screen &  back();
	Screen &  up();
	Screen & down();
};

我们可能希望定义一个move函数,它可以调用这些函数中的任意一个并执行指定的动作,为此,在Screen中增加一个static成员,该成员是光标移动函数的指针的数组。
class Screen
{
	//Action is pointer that can be assigned any of the cursor movement members
	typedef Screen & ( Screen:: * Action )  ();
	//function table
	static Action menu[];

	//specify which direction to move
	enum Directions { HOME, FORWORD, BACK, UP, DOWN };
	Screen & move ( Directions );
};

名为menu的数组将保存指向每个光标移动函数的指针,将在对应于Direction中枚举成员的偏移位置保存那些函数,move函数接受枚举成员并调用适当函数:

Screen & Screen::move( Directions cm )
{
	//fetch the element in Menu indexed by cm
	//run that member on behalf of this object
	( this->*menu[cm])();
	return *this;
}

调用move时,传给它一个枚举成员,指出向哪个方向移动光标:

	Screen myScreen;
	myScreen.move(Screen::HOME);
	myScreen.move(Screen::BACK);

剩下的是定义和初始化表本身:

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


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:135399次
    • 积分:2091
    • 等级:
    • 排名:第18258名
    • 原创:75篇
    • 转载:3篇
    • 译文:2篇
    • 评论:6条
    文章分类
    最新评论