冒着被语言律师否决的风险,这里有一些黑客的建议给你,希望它可能会很有趣。私有成员不应该从类和类的朋友之外访问。但是,如果您绝对必须访问该类的那些成员字段,那么像这样的 hack 可能会起作用:
#include <iostream>
class vivek {
int i;
float d;
public:
vivek() : i(4), d(4.44) {}
~vivek() {}
};
int main()
{
vivek viku;
struct badhack {
int i;
float d;
} *h = (sizeof(badhack) == sizeof viku ? (badhack*)&viku
: ((badhack*)((char*)&viku + sizeof(void*))));
std::cout << "i=" << h->i << ", d=" << h->d << std::endl;
}
请注意使用 sizeof 的游戏——这只是确定一个虚拟表的示例,该表采用sizeof(void*)
字节并且是类中的第一个隐式字段,是否应该有任何虚拟成员。如果你不这样做并且一个类恰好有一个虚拟表,那么数据偏移量就会被搞砸,这个技巧将不起作用,所以这就是我们按sizeof(void*)
字节调整偏移量以避免这个问题的原因。现在,这不是由标准定义的并且是特定于编译器的,但我从未遇到过以不同方式实现虚拟表的编译器,因为这是最有效的方式。
另一种选择就像这样简单:
#include <iostream>
#define class struct
#define private public
class vivek {
int i;
float d;
public:
vivek() : i(4), d(4.44) {}
~vivek() {}
};
int main()
{
vivek viku;
std::cout << "i=" << viku.i << ", d=" << viku.d << std::endl;
return 0;
}
但是请注意,上述内容很可能不适用于成员函数。如今的编译器很聪明,并且根据访问级别不同地修改函数名称。
并且请不要使用这样的技巧,除非有必要挽救某人的生命并且您愿意牺牲自己的生命作为回报。