有什么方法可以访问类的私有成员变量吗?

San*_*eep 9 c++

有什么方法可以访问类的私有成员变量吗?

编辑:不是来自成员函数或朋友函数,而是来自实例.

Chr*_*ung 12

GotW#76有关于如何做这些事情的迷人的语言 - 律师细节.:-)


Gre*_*ill 5

C++的一个"肮脏技巧"是做类似的事情:

#define private public
#include "ClassHeader.h"

// now all the private members of the included class are public
Run Code Online (Sandbox Code Playgroud)

强烈建议你不要这样做.

  • C++标准的第17.4.3.1.1节:"这样的翻译单元也不应该为与关键字词汇相同的名称定义宏." 当然,没有已知的编译器拒绝这样的程序. (7认同)
  • 虽然你已经添加了免责声明,但有些事情不应该发布......这让疯狂的人们太容易做到了. (4认同)

GMa*_*ckG 5

你可以:

  1. 将私人成员放在公共部分
  2. 让你的班级或功能成为班上的朋友.
  3. 提供数据访问器.
  4. 获取类的地址,将偏移量添加到该变量,强制转换和取消引用.(呸)

你想做什么?如果某些东西是私人的,请不要乱用它.这是私人的原因.


Eug*_*ene 5

只需将其转换,转移内存并退回.(没有编译代码,但你应该得到这个想法).

class Bla
{
public:
    Bla() : x(15), str("bla") {}
private:
    int x;
    std::string str;
}

int main()
{
    Bla bla;

    int x = *((int*)(&bla));
    std::string str = *((std::string*)((int*)(&bla) + 1));

    std::cout << x << str;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

由于这是一个面试问题,我不会讨论为什么你不应该这样做.:)

编辑:具有虚函数的类也将在那里的某处具有虚拟表指针.我不确定是否会给你第一个数据成员的地址或地址.

默认情况下,对齐方式为4(右?),因此如果您正在阅读的成员未对齐,请移动2个字节以转到下一个字节.