实例解析C++中类的成员函数指针

2020-01-06 14:59:23于丽

 

(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; 
} 

(2) 在一个“类”内,有标准库函数,如qsort, 或其他全局函数,用函数指针调用类的成员函数。如:

例子2:


#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; 
} 

(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参数中所调用的函数类型不对。