大胆使用指向成员函数的指针
2004-08-10 17:40
337 查看
大胆使用指向成员函数的指针
指向成员函数的指针是C++中比较复杂的语法结构,然而,它却是事件驱动和多线程环境中不可缺少的,特别是当从外部调用成员函数的时候。在多线程里,每一个线程都通过指向成员函数的指针调用这一函数。如果C++没有这些语法特性,那么在很多情况下进行C++程序开发会遇到很多麻烦。
也许你开始会被这一性质的语法吓倒,但当你熟悉之后你就会觉得它相当方便,并且可以通过使用typedef声明来简化。这一节里我将讲述如何声明一个指向成员函数的指针,赋一个值给它,通过这一指针调用函数。
声明一个指向成员函数的指针
一个指向成员函数的指针包括成员函数的返回类型,带::符号的类名称,函数参数表。虽然这一语法看似复杂,其实它和普通的指针是一样的。指向外部函数的指针可如下声明:
以上pmf是指向类A的一个成员函数的指针,传递两个变量char *和 const char *,没有返回值。注意星号前面的A::符号,这和前面的声明是一致的。
赋值
为了给一个指向成员函数的指针赋值,可以采用成员函数名并再其前面加一个&的方式,代码范例可参见Listing A。虽然一些旧的编译器可以忽略&号,但在标准C++中是不允许的。
使用typedef
你可以使用typedef来隐藏一些指向成员函数的复杂指针。例如,下面的代码定义了一个类A中的成员函数的指针PMA,并传递char *和const char *参数。
固定的成员函数
指向成员函数的类型包括成员函数的名称,成员函数固定/不固定的性质。只要成员函数是可变的,pmf 会指向任一成员
函数。所以,如果你想把touppercase()的地址赋于pmf ,程序会发生错误,因为touppercase()是固定的,
Listing D显示了这一例子的代码。
虽然有些编译器能允许非固定指针指向一个固定的成员函数,但在标准C++中是不允许的。
结论指向成员函数的指针实质上是包含多种数据成员的复杂数据结构。刚开始时你也许觉得它深不可测,但一旦你掌握并习惯
了这一语法,你会觉得这一方法在程序设计中是必不可少的,特别是在事件驱动和多线程设计中频繁调用函数的时候。
[/code]
指向成员函数的指针是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。指向成员函数的指针即有多态 性,这样如果你通过这一指针来调用虚成员函数时,这一调用即是动态的。 高级使用方法掌握了最基本的用法后,让我们看看一些高级的用法: 指向成员函数的数组指针 在下面的例子中,我声明了指向成员函数的两个指针的数组,并给它们赋于类的成员函数的地址: [code]PMA pmf[2]={&A::strcpy, &A::strcat};这样的数组在菜单驱动程序非常有用,如表C Listing C所示。
固定的成员函数
指向成员函数的类型包括成员函数的名称,成员函数固定/不固定的性质。只要成员函数是可变的,pmf 会指向任一成员
函数。所以,如果你想把touppercase()的地址赋于pmf ,程序会发生错误,因为touppercase()是固定的,
Listing D显示了这一例子的代码。
虽然有些编译器能允许非固定指针指向一个固定的成员函数,但在标准C++中是不允许的。
结论指向成员函数的指针实质上是包含多种数据成员的复杂数据结构。刚开始时你也许觉得它深不可测,但一旦你掌握并习惯
了这一语法,你会觉得这一方法在程序设计中是必不可少的,特别是在事件驱动和多线程设计中频繁调用函数的时候。
[/code]
相关文章推荐
- error: 函数调用缺少参数列表;请使用“&BinTree<char>::_PrintNode”创建指向成员的指针
- c++11 条款22:当使用Pimpl(指向实现的指针)时,在实现文件里定义特定的成员函数
- C++里,在类中使用指向类成员函数的指针
- 函数调用缺少参数列表;请使用“&****Dlg::getThread”创建指向成员的指针”--多线程函数调用
- error C3867: “A::fun1”: 函数调用缺少参数列表;请使用“&A::fun1”创建指向成员的指针
- 函数调用缺少参数列表;请使用“&Student::Printf”创建指向成员的指针 问题解析
- “error C3867: “XXX”: 函数调用缺少参数列表;请使用“&XXX”创建指向成员的指针”的错误
- C++中,如何定义和使用指向成员函数的指针
- static函数 函数调用缺少参数列表;请使用“&XXX”创建指向成员的指针;类的static成员函数
- “error C3867: “XXX”: 函数调用缺少参数列表;请使用“&XXX”创建指向成员的指针”的错误
- Qt使用回调函数报错“函数调用缺少参数列表,请使用&xxx创建指向成员的指针”解决办法
- error C3867: “Point::getX”: 函数调用缺少参数列表;请使用“&Point::getX”创建指向成员的指针
- “Caculate::writehtml”: 函数调用缺少参数列表;请使用“&Caculate::writehtml”创建指向成员的指针
- 指向成员函数的指针
- C语言技巧--在结构体中使用函数例子(定义一个指向函数的指针)
- Item 16. 指向成员函数的指针
- 类成员函数指针的使用
- typedef使用大全3(指向函数的指针)
- 二维数组做函数参数,如何将三维数组降为二维数组,指向数组的指针的使用
- typedef使用大全3(指向函数的指针)