C++函数指针

来源:互联网 发布:云计算的架构和类型 编辑:程序博客网 时间:2024/05/01 14:39

在C++中,成员函数的指针一般是这么用的,

view plain
  1. #include <stdio.h>  
  2.   
  3. class A{  
  4. public:  
  5.     char hello(int a){  
  6.         printf("hello world");  
  7.         return a-'0';  
  8.     }  
  9. };  
  10.   
  11. typedef char (A::*PTRFUN)(int);  
  12.   
  13.   
  14. int main()  
  15. {  
  16.     A* obj=new A();  
  17.     PTRFUN pFun= &A::hello;   
  18.     (obj->*pFun)(2);  
  19.     return 0;  
  20. }  

但你可能遇到这样的情况,C++要将对象和函数指针传递给c,然后由c去调用,你可能会这么做:

void invokeFunc(void* obj,void* pfunc)

{

A* class_obj=(A*)obj;

PTRFUN pFun=(PTRFUN)pfunc;

(class_obj->*pFun)(2);

}

 

int main()

{

A* obj=new A();

PTRFUN pFun;

pFun = &A::hello; 
invokeFunc(obj,pFun);

}

但是你会发现编译器会对PTRFUN pFun=(PTRFUN )pfunc;报错,你可以这样做:

view plain
  1. #include <stdio.h>  
  2.   
  3. class A{  
  4. public:  
  5.     char hello(int a){  
  6.         printf("hello world");  
  7.         return a-'0';  
  8.     }  
  9. };  
  10.   
  11. typedef char (A::*PTRFUN)(int);  
  12.   
  13. void invokeFunc(void* obj,void* pfunc)  
  14. {  
  15.     A* class_obj=(A*)obj;  
  16.     PTRFUN* pFun2=(PTRFUN*)pfunc;  
  17.     PTRFUN pFun=*pFun2;  
  18.     (class_obj->*pFun)(2);  
  19. }  
  20.   
  21. int main()  
  22. {  
  23.     A* obj=new A();  
  24.     PTRFUN pFun;  
  25.     pFun = &A::hello;   
  26.     invokeFunc(obj,&pFun);  
  27.     return 0;  
  28. }  

也就是将一级指针转换为2级指针,这样编译就不会读void*转成员函数指针进行报错。

原创粉丝点击