在编程工作中常会遇到在一个“类”中通过函数指针调用成员函数的要求,如,当在一个类中使用了C++标准库中的排序函数qsort时,因qsort
参数需要一个“比较函数”指针,如果这个“类”使用某个成员函数作“比较函数”,就需要将这个成员函数的指针传给qsort供其调用。本文所讨论的用指针
调用 “类”的成员函数包括以下三种情况:
(1).将 “类”的成员函数指针赋予同类型非成员函数指针,如:
例子1
#include <stdlib.h> typedef void (*Function1)( ); //定义一个函数指针类型。 Function1 f1; class Test1 { public: //…被调用的成员函数。 void Memberfun1( ){ printf(%s \n,Calling Test3::Memberfun2 OK);}; // void Memberfun2() { f1=reinterpret_cast<Function1>(Memberfun1);//将成员函数指针赋予f1。编译出错。 f1(); } //… }; int main() { Test1 t1; t1.Memberfun2(); return 0; } |
#include <stdlib.h> class Test2 { private: int data[2]; //… public: //… int __cdecl Compare(const void* elem1, const void* elem2) //成员函数。 { printf(%s \n,Calling Test2::Memberfun OK); return *((int*)elem1)- *((int*)elem2) ; } void Memberfun() { data[0]=2; data[1]=5; qsort( data, 2, sizeof(int), Compare); //标准库函数调用成 //员函数。编译出错。 } //… }; int main( ) { Test2 t2; t2.Memberfun(); //调用成员函数。 return 0; } |
[NextPage]
(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; } |
#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; } |
#include stdafx.h #include <iostream> #include <typeinfo.h> class Test; //一个未定义的类。 class Test2 //一个空类。 { }; class Test3 //一个有定义的类。 { public: //... void (* memberfun)(); void Memberfun1( void (* f2)( ) ) { f2( ) ;} //成员函数1调用成员函数//2。 void Memberfun2( );//成员函数2。 //… }; class Test4: virtual Test3 ,Test2 //一个有virtual继承的类(derivative class)。 { public: void Memberfun1( void (* f2)( ) ) { f2( ) ;} }; class Test5: Test3,Test2 //一个继承类(derivative class)。 { public: void Memberfun1( void (* f2)( ) ) { f2( ) ;} }; int main() { std::cout <<一般函数指针长度= << sizeof(void(*)()) << '\n'; std::cout <<-类的成员函数指针长度-<<'\n'<<'\n'; std::cout <<Test3类成员函数指针长度=<< sizeof(void(Test3::*)())<<'\n'<<'\n'; std::cout <<Test5类成员函数指针长度=<<sizeof(void (Test5:: *)())<<'\n'; std::cout <<Test4类成员函数指针长度=<<sizeof(void (Test4:: *)())<<'\n'; std::cout <<Test类成员函数指针长度=<<sizeof(void(Test::*)()) <<'\n'; return 0; } |
[NextPage]
那么,当需要时,如何用指针调用类的成员函数?可以考虑以下方法:
(1) 将需要调用的成员函数设为static 类型,如:在前述例子2中,将class Test2 成员函数Compare 定义前加上static 如下(黑体为改变之处):
class Test2 { //…. int static __cdecl Compare(const void* elem1, const void* elem2) //成员函数。 //其他不变 } |
class Test3 { public: //… void static __cdecl Helper(Test3* test3) { test3->Memberfun2(); } void Memberfun1( void (* f2)(Test3*)) { f2(this) ;} //将对象信息传给Helper函数。 void Memberfun2( ) {printf(%s \n,Calling Test3::Memberfun2 OK); } //成员函数2。 void Memberfun3( ) { Memberfun1( Helper);} //… }; |
class Test3; void __cdecl Helper(Test3* test3); class Test3 { public: //… void Memberfun1( void (* f2)(Test3*)) { f2(this) ;} //成员函数1调用成员函数//2。 void Memberfun2( ) {printf(%s \n,Calling Test3::Memberfun2 OK); } //成员函数2。 void Memberfun3( ) { Memberfun1( Helper);} //… }; void __cdecl Helper(Test3* test3) { test3->Memberfun2(); }; |