注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

太阳神上的博客

青青子衿,悠悠我心,但为君故,沉吟至今。

 
 
 

日志

 
 
 
 

更深入了解C++的指向类成员的指针  

2007-09-05 01:11:18|  分类: 学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

  上次,我发现可以通过了解C++的name mangling机制来获取C++成员的指针,但那种方法太猥琐,且不同的编译器name mangling的方法不同,而且有些编译器通过name mangling生成的链接名中会含有一些特殊的符号如@等,那就不能用那种方法了。其实,C++的指向类成员函数的指针其实是一个两个字长的结构,其中前一个字长就是地址,后一个字长的值为0,而指向类的数据成员的指针其实是一个偏移量,占一个字长。这是我通过printf得知的。因为printf的参数从第二参数起都不限定类型,因此可以清楚了了解这些东西的实质。
   基于以上认识后,我就可以编写出更加完善的获取类成员地址的方法了,例子如下:

#include <stdio.h>

class Person{
public:
    int id;

    Person(int id):id(id){
    }
    
    int getID(){
        return id;
    }
};

void *GetMemberAddress(void *offset,...){
    return *(&offset+1);
}

int main(){    
    Person p(5);
    typedef int (*func_type)(Person*);
    func_type foo=func_type(GetMemberAddress(NULL,&Person::getID));      
    printf("%d",foo(&p));
    getchar();
    return 0;
}

  这种方法显然好用得多,其实了解了语言背后的机理,我们就往往可以用一些特殊的方法可破除很多限制。
  评论这张
 
阅读(119)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017