加入收藏 收藏网站 设为首页 设为首页
招生考试网
学历类| 阳光高考 研 究 生 自学考试 成人高考 专 升 本 中考会考 外语类| 四 六 级 职称英语 商务英语 公共英语 日语能力
资格类| 公 务 员 报 关 员 银行从业 司法考试 导 游 证 教师资格 财会类| 会 计 证 经 济 师 会计职称 注册会计 税 务 师
工程类| 一级建造 二级建造 造 价 师 造 价 员 咨 询 师 监 理 师 医学类| 卫生资格 执业医师 执业药师 执业护士 国际护士
计算机| 等级考试 软件水平 应用能力 其它类| 书画等级 美国高考 驾 驶 员 书法等级 少儿英语 报 检 员 单 证 员 出国留学
 招生考试网 - 计算机等级考试 - 考试辅导 - 正文

 
C++中使用指针调用 “类”的成员函数
来源:fjzsksw.com 2010-1-19 编辑:zhoupanyu 【字体:小 大】
在编程工作中常会遇到在一个“类”中通过函数指针调用成员函数的要求,如,当在一个类中使用了C++标准库中的排序函数qsort时,因qsort参数需要一个“比较函数”指针,如果这个“类”使用某个成员函数作“比较函数”,就需要将这个成员函数的指针传给qsort供其调用。本文所讨论的用指针调用 “类”的成员函数包括以下三种情况

 

  int main( )

  {

  Test2 t2;

  t2.Memberfun(); //调用成员函数。

  return 0;

  }

  (3)同一个“类”内,一个成员函数调用另一个成员函数, 如:

  例子3:

  #include "stdlib.h"

  class Test3

  {

  public:

  //…

  void Memberfun1( void (* f2)( ) ) { f2( ) ;} //成员函数1调用成员函数//2。

  void Memberfun2( ) { printf("%s \n","Calling Test3::Memberfun2 OK");} //成员函数2。

  void Memberfun3( ) { Memberfun1( Memberfun2);} // 编译出错

  //…

  };

  int main( )

  {

  Test3 t3;

  t3.Memberfun3(); //调用成员函数。

  return 0;

  }

  以上三种情况的代码语法上没有显着的错误,在一些较早的编译环境中,如,VC++ 4.0, 通常可以编译通过,或至多给出问题提醒(Warning)。后来的编译工具,如,VC++6.0和其他一些常用的C++编译软件,不能通过以上代码的编译, 并指出错误如下(以第三种情况用VC++ 6.0编译为例):

  error C2664: 'Memberfun1' : cannot convert parameter 1 from 'void (void)' to 'void (__cdecl *)(void)'

  None of the functions with this name in scope match the target type

  即:Memberfun1参数中所调用的函数类型不对。

  按照以上提示,仅通过改变函数的类型无法消除错误,但是,如果单将这几个函数从类的定义中拿出来,不作任何改变就可以消除错误通过编译, 仍以第三种情况为例,以下代码可通过编译:

  #include <stdlib.h>

  void Memberfun1( void (* f2)( ) ) { f2( ) ;} //原成员函数1调用成员函数//2。

  void Memberfun2( ) { printf("%s \n","Calling Test3::Memberfun2 OK");} //原成员函数2。

  void Memberfun3( ) { Memberfun1( Memberfun2);}

  int main( )

  {

  Memberfun3 ();

  return 0;

  }

  第1、 2种情况和第3种情况完全相同。

  由此可以的得出结论,以上三种情况编译不能通过的原因表面上并不在于函数类型调用不对,而是与 “类”有关。没通过编译的情况是用函数指针调用了 “类”的成员函数,通过编译的是用函数指针调用了非成员函数,而函数的类型完全相同。那么, “类”的成员函数指针和非成员函数指针有什么不同吗?

  在下面的程序中,用sizeof()函数可以查看各种“类”的成员函数指针和非成员函数指针的长度(size)并输出到屏幕上。

  #include "stdafx.h"

  #include <iostream>

  #include <typeinfo.h>

  class Test; //一个未定义的类。

  class Test2 //一个空类。

  {

  }

 



 
网站版权与免责声明
①由于各方面情况的不断调整与变化,本网所提供的相关信息请以权威部门公布的正式信息为准.
②本网转载的文/图等稿件出于非商业性目的,如转载稿涉及版权等问题,请在两周内来电联系.
最新文章
热门文章

报名考试
全国 | 黑龙江 | 吉林 | 辽宁 | 内蒙古
青海 | 宁夏 | 甘肃 | 新疆 | 陕西
西藏 | 北京 | 天津 | 河北 | 山东
江苏 | 安徽 | 河南 | 上海 | 浙江
福建 | 广东 | 山西 | 湖南 | 湖北
江西 | 广西 | 海南 | 云南 | 贵州
四川 | 重庆
分省高校计算机考试
黑龙江 | 吉林 | 辽宁 | 内蒙古 | 河北
北京 | 天津 | 新疆 | 甘肃 | 宁夏
青海 | 陕西 | 山西 | 河南 | 山东
江苏 | 安徽 | 浙江 | 福建 | 广东
海南 | 广西 | 江西 | 湖北 | 湖南
四川 | 上海 | 重庆 | 贵州 | 云南
西藏
成绩查询
报考指南
试题答案
模拟试题
考试辅导
计算机一级 | 计算机二级 | 计算机三级 | 计算机四级
经验交流
高校计算机