c++ - 我可以在不使用 friend 的情况下从类外访问私有(private)成员吗?

标签 c++ encapsulation private-members

免责声明

是的,我完全知道我问的是完全愚蠢的,任何想在生产代码中尝试这种事情的人都应该被解雇和/或枪毙。我主要是想看看是否可以完成。

既然已经解决了,有没有办法从类外部访问 C++ 中的私有(private)类成员?例如,有什么方法可以用指针偏移来做到这一点吗?

(欢迎使用天真和其他非生产就绪技术)

更新

如评论中所述,我问这个问题是因为我想写一篇关于过度封装(以及它如何影响 TDD)的博文。我想看看是否有一种方法可以说明“即使在 C++ 中,使用私有(private)变量也不是 100% 可靠的强制封装方式。”最后,我决定更多地关注如何解决问题而不是为什么会出现问题,所以我没有像我计划的那样突出这里提出的一些内容,但我仍然留下了一个链接。

无论如何,如果有人对它的结果感兴趣,请看这里:Enemies of Test Driven Development part I: encapsulation (我建议您在确定我疯了之前阅读它)。

最佳答案

如果类包含任何模板成员函数,您可以专门化该成员函数以满足您的需要。即使原始开发者没有想到。

安全.h

class safe
{
    int money;

public:
    safe()
     : money(1000000)
    {
    }

    template <typename T>
    void backdoor()
    {
        // Do some stuff.
    }
};

主要.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

关于c++ - 我可以在不使用 friend 的情况下从类外访问私有(private)成员吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26830845/

相关文章:

c++ - 图像处理中的并发设计

C++将结构指针转换为类型值

javascript - 如何封装跨多个 Controller 设置 $scope 值?

c++ - 无法从 .cpp 访问 .h 中声明的私有(private)成员

C++ 私有(private)结构

c++ - 调整窗口大小时不断发送窗口消息 WM_SIZING

c++ - 什么时候应该在 C++ 中使用 'friend'?

c++ - 重载 operator= 作为非成员

C++选择排序——插入方法和私有(private)变量

c++ - 如何在调用删除 C++ 后向上移动字符串 vector 的内容