在C++中如何访问一个类里面的私有变量?

jerrykid 2006-08-14 05:37:26
在C++中如何访问一个类里面的私有变量?谢谢大家,除了定义友元之外还有什么其他的好办法吗?今天面试遇到的一个问题,请各位大侠点拨点拨!
...全文
741 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
qtext 2006-08-15
  • 打赏
  • 举报
回复
如果类所在单元已编译成lib/DLL,没有源码的情况下,mengge的第三种方法
*((int *)&a+1) = 4; // 为类的私有变量赋值

是一种较好的办法。
jerrycxl 2006-08-15
  • 打赏
  • 举报
回复
基本是定义自己PUBLIC函数,操作私有成员变量.
踏岸寻柳 2006-08-15
  • 打赏
  • 举报
回复
#include <stdio.h>

class A
{
public:
int a;

private:
int b;
int c;

public:
A()
{
a = 1;
b = 2;
c = 3;
}

void Print()
{
printf("a = [%x:%d], b = [%x:%d], c = [%x:%d]\n", &a, a, &b, b, &c, c);
}
};

int main(int argc, char *argv[])
{
A a;
a.Print();

*((int *)&a+1) = 4; // 为类的私有变量赋值
a.Print();

return 0;
}
踏岸寻柳 2006-08-15
  • 打赏
  • 举报
回复
1. 使用类的public方法来访问;
2. 使用友元来访问;
3. 使用偏移量来访问。

前两种方法属于正统、传统方法,后一种属于剑走偏锋。如:
class A
{
public:
int a;

private:
int b;
int c;

public:
A()
{
a = 1;
b = 2;
c = 3;
}
};

int main(int argc, char *argv[])
{
A a;
printf("A.b address is %x, A.b is %d\n", &a, *((int *)&a+1));

*((int *)&a+1) = 4; // 为类的私有变量赋值
printf("A.b address is %x, A.b is %d\n", &a, *((int *)&a+1));

return 0;
}
阿发伯 2006-08-14
  • 打赏
  • 举报
回复
正确的方法就2种:定义友元或者接口函数。

有时迫不得已要操作别人的类,例如从别人的类派生适合自己的类,想要取得私有数据的时候,不妨使用UPCC(杂食动物) 的方法,那其实就是类实例的this。但当数据多,而且派生层次较深时,很难得到你想要的数据的地址偏移,必须反复测试,同时不同的编译器和编译指令可能改变这个偏移,例如数据对齐指令,也就是移植性差。
jerrykid 2006-08-14
  • 打赏
  • 举报
回复
我说的是在这个类在外部怎么访问类中的私有变量?大家有什么高见?
triace_zhang 2006-08-14
  • 打赏
  • 举报
回复
终极方法:在类里把main()主函数申明为友元,然后就可以在main()里为所欲为了。
chenhu_doc 2006-08-14
  • 打赏
  • 举报
回复
用friend
或者
在class里面写set**()和get**()函数,用接口对private数据成员进行读和写
Dong 2006-08-14
  • 打赏
  • 举报
回复
使用接口/属性调用啊,或者使用

class T
{
int i;
}

T t;
int& i = *(int*)&T;
i = 5;
Heaven_Redsky 2006-08-14
  • 打赏
  • 举报
回复
只要定义public接口函数就好
调用这些函数 想怎么访问就怎么访问了:)
cnhgj 2006-08-14
  • 打赏
  • 举报
回复
声明为友元
ckt 2006-08-14
  • 打赏
  • 举报
回复
通过类的公共函数访问啊
或者是友元函数或者友元类的公共函数都可以访问
triace_zhang 2006-08-14
  • 打赏
  • 举报
回复
在类里定义public函数接口访问私有函数

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧