相关疑难解决方法(0)

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

放弃

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

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

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

更新

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

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

c++ encapsulation private-members

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

访问私有嵌套类

我做了这个简单的课程,仍然在玩我的想法:

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)

标准方面是否存在漏洞?

c++ language-lawyer c++11

17
推荐指数
2
解决办法
722
查看次数