是的,我完全清楚我所询问的内容是完全愚蠢的,任何想要在生产代码中尝试这样的事情的人都应该被解雇和/或开枪.我主要是想看看是否可以做到.
现在已经不在了,有没有办法从类外部访问C++中的私有类成员?例如,有没有办法用指针偏移来做到这一点?
(天真和其他非生产准备技术欢迎)
正如评论中所指出的,我问了这个问题,因为我想写一篇关于过度封装的博客文章(以及它如何影响TDD).我想看看是否有办法说"使用私有变量不是100%可靠的方法来强制封装,即使在C++中也是如此." 最后,我决定更多地关注如何解决问题,而不是为什么这是一个问题,所以我没有像我原先计划的那样突出显示这里提到的一些东西,但我还是留下了一个链接.
无论如何,如果有人对它的出现感兴趣,那么它就是: 测试驱动开发的敌人第一部分:封装(我建议在你决定我疯了之前阅读它).
这纯粹是一个理论问题,我知道如果有人声明私有方法,你可能不应该调用它.我设法调用私有虚方法并更改实例的私有成员,但我无法弄清楚如何调用私有非虚方法(不使用__asm).有没有办法获得指向该方法的指针?有没有其他方法可以做到这一点?
编辑:我不想改变类定义!我只想要一个黑客/解决方法.:)
通过将类转换为void指针然后转换为结构来访问类的私有成员是否合适?
我认为我没有权限修改包含我需要访问的数据成员的类.如果不符合道德规范,我不想以间接方式冒险访问数据成员.
编辑:不得不进一步编辑...我很确定这个类不会被修改,所以它可以在那个程度上...我唯一关心的是,如果编写该类的人知道这一点,它可能跟他没关系:(.
我有一个基本的C++问题,不幸让我感到困惑.最近我遇到了一篇文章,该文章使用向下转换来使用向下转换来访问类的私有成员.我的问题是它为什么有效?
鉴于我有一个父类P,其私有成员m_p的类型为dummy*,那么使用的方法是创建一个hack类hackP,如下所示:
class hackP: public P {
public:
dummy *m_p;
};
Run Code Online (Sandbox Code Playgroud)
显然,使用像这样的代码片段可以访问class P私有成员m_p
P parent = ...;
hackP *hp = (hackP*)&parent;
// access parent m_p as hp->m_p
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.