本节书摘来自异步社区出版社《C和C++代码精粹》一书中的第2章,第2.13节,作者: 【美】Chuck Allison,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.13 指向成员函数的指针
C和C++代码精粹
如果返调函数是某个类的成员函数将会怎样?获得指向类成员的指针与获得指向非成员实体的指针的方式相似,只存在很小的语法变化。例如,考虑下面类的定义:
class C
{
public:
void f ( ) {cout << "C::f\n";}
void g( ) {cout << "C::g\n";}
};
可以这样定义一个指向C类成员函数的指针:
void (C::*pmf) ( ); // pmf是指向C的成员函数的指针
//不带参数并且没有返回值
可以根据需要来初始化pmf使其指向不同的成员函数,如下面的程序所示:
main( )
{
C c;
void (C::*pmf) ( ) =&C::f;
(c.*pmf) ( );
pmf =&C:: g;
(c.*pmf) ( );
}
//输出:
C::f
C::g
. 运算符调用了代表其左边操作数所指向的对象的成员函数。如果 cp 是一个指向 C 的指针,那么可以使用->运算符,就像:
( cp->*pmf ) ( );
由于C++定义运算符优先级的方式,所以圆括号是完全确认所调用的函数所必需的。请参见程序清单2.19(程序清单2.18菜单例子的指向成员函数指针的版本)。
程序清单2.19 举例说明对成员的指针
// menu2.cpp: 使用指向函数成员的指针
#include <iostream>
using namespace std;
class Object
{
public:
void retrieve() {cout << "Object::retrieve\n";}
void insert() {cout << "Object::insert\n";}
void update() {cout << "Object::update\n";}
void process(int choice);
private:
typedef void (Object::*Omf)();
static Omf farray[3];
};
Object::Omf Object::farray[3] =
{
&Object::retrieve,
&Object::insert,
&Object::update
};
void Object::process(int choice)
{
if (0 <= choice && choice <= 2)
(this->*farray[choice])();
}
main()
{
int show_menu(); //你所提供的!
Object o;
for (;;)
{
int choice = show_menu();
if (1 <= choice && choice <= 3)
o.process(choice-1);
else if (choice == 4)
break;
}
}
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。