大胆使用指向成员函数的指针

大胆使用指向成员函数的指针
        指向成员函数的指针是C++中比较复杂的语法结构,然而,它却是事件驱动和多线程环境中不可缺少的,特别是当从外部调用成员函数的时候。在多线程里,每一个线程都通过指向成员函数的指针调用这一函数。如果C++没有这些语法特性,那么在很多情况下进行C++程序开发会遇到很多麻烦。

        也许你开始会被这一性质的语法吓倒,但当你熟悉之后你就会觉得它相当方便,并且可以通过使用typedef声明来简化。这一节里我将讲述如何声明一个指向成员函数的指针,赋一个值给它,通过这一指针调用函数。

声明一个指向成员函数的指针

一个指向成员函数的指针包括成员函数的返回类型,带::符号的类名称,函数参数表。虽然这一语法看似复杂,其实它和普通的指针是一样的。指向外部函数的指针可如下声明:

void (*pf)(char *, const char *);
void strcpy(char * dest, const char * source);
pf=strcpy;


相应指向类A的成员函数的指针如下表示:

void (A::*pmf)(char *, const char *);

以上pmf是指向类A的一个成员函数的指针,传递两个变量char *const char *,没有返回值。注意星号前面的A::符号,这和前面的声明是一致的。

赋值

为了给一个指向成员函数的指针赋值,可以采用成员函数名并再其前面加一个&的方式,代码范例可参见Listing A。虽然一些旧的编译器可以忽略&号,但在标准C++中是不允许的。

使用typedef

你可以使用typedef来隐藏一些指向成员函数的复杂指针。例如,下面的代码定义了一个类A中的成员函数的指针PMA,并传递char *const char *参数。

typedef void(A::*PMA)(char *, const char *);
PMA pmf= &A::strcat; // use a typedef to define a pointer to member

使用typedef特别有用,尤其是对于指向成员函数的数组指针。

 

通过指针来调用成员函数

指向成员函数的指针可以调用对象的成员函数而无需知道这一函数的名称。例如一个发送函数,它通过pmf来调用一函数,

这一函数与是否指向strcpy() strcat()无关。这与传统的指针调用外部方法是不一样的。传统的指针调用方法是这

样的,你必须指定调用的成员函数所在的具体的对象。

为了能清楚说明这一点,让我们来看一个例子。假设你有两个类A的对象,如Listing B。指向成员函数的指针即有多态

性,这样如果你通过这一指针来调用虚成员函数时,这一调用即是动态的。

高级使用方法

掌握了最基本的用法后,让我们看看一些高级的用法:

指向成员函数的数组指针

在下面的例子中,我声明了指向成员函数的两个指针的数组,并给它们赋于类的成员函数的地址:

PMA pmf[2]={&A::strcpy, &A::strcat};

这样的数组在菜单驱动程序非常有用,如表C Listing C所示。

固定的成员函数

指向成员函数的类型包括成员函数的名称,成员函数固定/不固定的性质。只要成员函数是可变的,pmf 会指向任一成员

函数。所以,如果你想把touppercase()的地址赋于pmf ,程序会发生错误,因为touppercase()是固定的,

Listing D显示了这一例子的代码。

虽然有些编译器能允许非固定指针指向一个固定的成员函数,但在标准C++中是不允许的。

结论

指向成员函数的指针实质上是包含多种数据成员的复杂数据结构。刚开始时你也许觉得它深不可测,但一旦你掌握并习惯

了这一语法,你会觉得这一方法在程序设计中是必不可少的,特别是在事件驱动和多线程设计中频繁调用函数的时候。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值