我可以在不使用朋友的情况下从课外访问私人会员吗?放弃是的,我完全清楚我所询问的内容是完全愚蠢的,任何想要在生产代码中尝试这样的事情的人都应该被解雇和/或开枪。我主要是想看看是否可以做到。现在已经不在了,有没有办法从类外部访问C ++中的私有类成员?例如,有没有办法用指针偏移来做到这一点?(天真和其他非生产准备技术欢迎)更新正如评论中所指出的,我问了这个问题,因为我想写一篇关于过度封装的博客文章(以及它如何影响TDD)。我想看看是否有办法说“使用私有变量不是100%可靠的方法来强制封装,即使在C ++中也是如此。” 最后,我决定更多地关注如何解决问题,而不是为什么这是一个问题,所以我没有像我原先计划的那样突出显示这里提到的一些东西,但我还是留下了一个链接。无论如何,如果有人对它的出现感兴趣,那么它就是: 测试驱动开发的敌人第一部分:封装(我建议在你决定我疯了之前阅读它)。
3 回答
holdtom
TA贡献1805条经验 获得超10个赞
如果类包含任何模板成员函数,您可以专门化该成员函数以满足您的需要。即使原始开发人员没有想到它。
safe.h
class safe{ int money;public: safe() : money(1000000) { } template <typename T> void backdoor() { // Do some stuff. }};
main.cpp中:
#include <safe.h>#include <iostream>class key;template <>void safe::backdoor<key>(){ // My specialization. money -= 100000; std::cout << money << "\n";}int main(){ safe s; s.backdoor<key>(); s.backdoor<key>();}
输出:
900000 800000
临摹微笑
TA贡献1982条经验 获得超2个赞
以下是偷偷摸摸,非法,依赖编译器,并且可能无法工作,具体取决于各种实现细节。
#define private public #define class struct
但它是你的OP的答案,你明确地邀请了一种技术,我引用它是“完全愚蠢的,并且任何希望在生产代码中尝试这样的事情的人都应该被解雇和/或开枪”。
另一种技术是通过使用来自对象开头的硬编码/手动编码偏移来构造指针来访问私有成员数据。
- 3 回答
- 0 关注
- 388 浏览
添加回答
举报
0/150
提交
取消