有什么方法可以访问类的私有成员变量吗?
编辑: 不是来自成员函数或朋友函数,而是来自实例。
答案 0 :(得分:12)
GotW #76有关于如何做这些事情的迷人的语言法律细节。 : - )
答案 1 :(得分:5)
C ++的一个“肮脏技巧”是做类似的事情:
#define private public
#include "ClassHeader.h"
// now all the private members of the included class are public
我强烈建议执行此操作。
答案 2 :(得分:5)
你可以:
你想做什么?如果某些东西是私人的,请不要乱用它。这是私人的原因。
答案 3 :(得分: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;
}
由于这是一个面试问题,我不会讨论为什么你不应该这样做。 :)
编辑: 具有虚函数的类也将在那里的某处具有虚拟表指针。我不确定是否&amp;将为您提供vt的地址或第一个数据成员的地址。
默认情况下对齐是4(对吗?),因此如果您正在阅读的成员没有对齐,请移动2个字节以进入下一个。
答案 4 :(得分:3)
是。您可以访问私人会员:
答案 5 :(得分:2)
虽然我们提出了不好的想法,但代码端没有任何内容强制执行封装 - 它完全是一个编译器技巧 - 因此您可以编写程序集来直接访问私有成员。
但是为什么不是重写基类如果它没有做你想要的呢?
答案 6 :(得分:2)
你为什么要这样做?
可见性规则很明确:
...因此 - 如果您自己编写课程,请选择正确的可见性。如果它是一个提供的类,那么小心的事情为什么它首先是私有的......
如果你决定违反该规则,你有几个选择:
friend
说明符与应该访问私有方法的类成为朋友答案 7 :(得分:0)
是,为什么不通过会员功能
答案 8 :(得分:0)
我认为这取决于问题的表达方式:
问:您如何访问私有成员变量? 答:我不会。
同时:
问:你将如何实施...... 答:我不会,已经完成了,我会利用现有的框架/库。采访者并不总是想知道你是否可以制造一个轮子,有时候他们正在探究你是否知道如何找到最近的服务站。 :)