是的,我完全清楚我所询问的内容是完全愚蠢的,任何想要在生产代码中尝试这样的事情的人都应该被解雇和/或开枪.我主要是想看看是否可以做到.
现在已经不在了,有没有办法从类外部访问C++中的私有类成员?例如,有没有办法用指针偏移来做到这一点?
(天真和其他非生产准备技术欢迎)
正如评论中所指出的,我问了这个问题,因为我想写一篇关于过度封装的博客文章(以及它如何影响TDD).我想看看是否有办法说"使用私有变量不是100%可靠的方法来强制封装,即使在C++中也是如此." 最后,我决定更多地关注如何解决问题,而不是为什么这是一个问题,所以我没有像我原先计划的那样突出显示这里提到的一些东西,但我还是留下了一个链接.
无论如何,如果有人对它的出现感兴趣,那么它就是: 测试驱动开发的敌人第一部分:封装(我建议在你决定我疯了之前阅读它).
我做了这个简单的课程,仍然在玩我的想法:
class A {
private:
class B {};
public:
B getB() {
return B();
};
};
Run Code Online (Sandbox Code Playgroud)
从C++ 03开始,这个类编译得很好,但是没有很好的方法可以将结果分配给getB()左值,在这个意义上:
A::B b = A().getB();
Run Code Online (Sandbox Code Playgroud)
不编译.
我通过使用中间模板得到它,以这种方式:
template <typename T>
struct HideType {
typedef T type;
};
HideType<A::B>::type b = A().getB();
Run Code Online (Sandbox Code Playgroud)
但这看起来很糟糕,因为这个简单的任务是得到一个A :: B左值变量.
从C++ 11开始就不再这样了,或者至少它不适用于gcc.此代码仍无效:
A::B b = A().getB();
Run Code Online (Sandbox Code Playgroud)
但这是有效的:
auto b = A().getB();
Run Code Online (Sandbox Code Playgroud)
标准方面是否存在漏洞?