相关疑难解决方法(0)

我可以在不使用朋友的情况下从课外访问私人会员吗?

放弃

是的,我完全清楚我所询问的内容是完全愚蠢的,任何想要在生产代码中尝试这样的事情的人都应该被解雇和/或开枪.我主要是想看看是否可以做到.

现在已经不在了,有没有办法从类外部访问C++中的私有类成员?例如,有没有办法用指针偏移来做到这一点?

(天真和其他非生产准备技术欢迎)

更新

正如评论中所指出的,我问了这个问题,因为我想写一篇关于过度封装的博客文章(以及它如何影响TDD).我想看看是否有办法说"使用私有变量不是100%可靠的方法来强制封装,即使在C++中也是如此." 最后,我决定更多地关注如何解决问题,而不是为什么这是一个问题,所以我没有像我原先计划的那样突出显示这里提到的一些东西,但我还是留下了一个链接.

无论如何,如果有人对它的出现感兴趣,那么它就是: 测试驱动开发的敌人第一部分:封装(我建议在你决定我疯了之前阅读它).

c++ encapsulation private-members

64
推荐指数
8
解决办法
6万
查看次数

指向数据成员地址的指针

我读过(Inside C++对象模型)C++中指向数据成员的指针的地址是数据成员加1的偏移量?
我在VC++ 2005上尝试这个,但我没有得到确切的偏移值.
例如:

Class X{  
  public:  
    int a;  
    int b;  
    int c;
}

void x(){  
  printf("Offsets of a=%d, b=%d, c=%d",&X::a,&X::b,&X::c);
}  
Run Code Online (Sandbox Code Playgroud)

应该打印偏移a = 1,b = 5,c = 9.但是在VC++ 2005中,它是a = 0,b = 4,c = 8.
我无法理解这种行为.
摘录自书:

"然而,对于C和C++程序员来说,这种期望是一个传统的错误.

如果vptr放在末尾,则类布局中三个坐标成员的物理偏移分别为0,4和8,如果vptr放置在类的开头,则分别为4,8和12.但是,从获取成员地址返回的值总是增加1.因此实际值为1,5和9,依此类推.问题是区分没有数据成员的指针和指向第一个数据成员的指针.考虑例如:

float Point3d::*p1 = 0;   
float Point3d::*p2 = &Point3d::x;   

// oops: how to distinguish?   
if ( p1 == p2 ) {   
   cout << " p1 & p2 contain the same value — ";   
   cout << " they must address the …
Run Code Online (Sandbox Code Playgroud)

c++ pointers

5
推荐指数
2
解决办法
2690
查看次数

标签 统计

c++ ×2

encapsulation ×1

pointers ×1

private-members ×1