博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一般函数指针和类的成员函数指针
阅读量:6896 次
发布时间:2019-06-27

本文共 978 字,大约阅读时间需要 3 分钟。

问题:在项目开发中,试图把类的非static成员函数的指针赋值给普通函数指针变量(前提当然是函数定义是一样的),结果编译不过。

原因:类的非static成员函数包含一个隐含的this指针。在某些calling convention下,this指针作为函数的附加参数入栈,相当于多了一个参数传入。另一个更通用的解释是:非static的成员函数指针的定义和调用都需要指明作用到哪个类/具体对象上,明显与一般函数指针的定义和调用是不兼容的。我的理解是非static的成员函数指针只是一个offset,因此需要在获取对象指针的基础上进行函数调用才行。类的静态成员函数采用与一般函数指针相同的调用方式,而受this指针的影响,类的非静态成员函数与一般函数指针是不兼容的。而且,不同类的this指针是不一样的,因此,指向不同类的非静态成员函数的指针也是不兼容的。指向类的非静态成员函数的指针,在声明时就需要添加类名。

A a1, a2;
  A *p= &a1; 
//
创建指向A的指针
  
//
创建指向成员的指针并初始化
  
void (A::*pmf)(
char *, 
const 
char *) = &A::strcpy;
  
//
要将成员函数绑定到pmf,必须定义呼叫的对象。
  
//
可以用*号引导:
  
void dispatcher(A a, 
void (A::*pmf)(
char *, 
const 
char *))
  {
   
char str[
4];
   (a.*pmf)(str, “abc”); 
//
将成员函数绑定到pmf
  }
  
//
或用A的指针表达方式指向成员指针:
  
void dispatcher(A * p, 
void (A::*pmf)(
char *, 
const 
char *))
  {
   
char str[
4]; (p->*pmf)(str, “abc”);
  }
  
//
函数的调用方法为:
  dispatcher(a, pmf); 
//
 .* 方式
  dispatcher(&a, pmf); 
//
 ->* 方式 

参考:

 

 

转载于:https://www.cnblogs.com/taoxu0903/archive/2012/02/08/2342311.html

你可能感兴趣的文章
idea配置git、GitHub
查看>>
Cocopods安装和升级备忘录
查看>>
如何用Python写一个贪吃蛇AI
查看>>
nginx全局变量
查看>>
今日一练习
查看>>
Kylin 在 58 集团的实践和应用
查看>>
javascript性能优化
查看>>
41. First Missing Positive
查看>>
sql的行转列(PIVOT)与列转行(UNPIVOT)
查看>>
sbt配置——数据源问题解决
查看>>
框架模式与设计模式之区别
查看>>
AngularJS+Satellizer+Node.js+MongoDB->Instagram-13
查看>>
CSS 实现打字效果
查看>>
jquery 根据已知值来修改单选框的被选中项
查看>>
html5 aside
查看>>
并发线程学习001(volatile 使用)
查看>>
JSONArray().fromObject(); 出现org.apache.catalina.core.StandardWrapperValve invoke错误的解决办法...
查看>>
取余和取模的小结
查看>>
JAVA应用CPU占用100%|内存泄漏分析总结
查看>>
SVN使用笔记-cleanup解决资源锁定(locked)
查看>>