在C++中,怎么在类外访问私有成员数据或函数?

Cqddq 2016-03-09 05:06:07
最近在学习C++,但其中通过类外访问私有成员函数这一块不能理解。

有哪位大神帮帮我能系统的介绍一下访问的方法? (对照着练习代码)

...全文
6146 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
LandyTan 2018-11-13
  • 打赏
  • 举报
回复
通过友元函数或友元类
KeepLiang 2018-11-05
  • 打赏
  • 举报
回复
利用友元函数友元类
CodeDog(c++品种) 2018-11-05
  • 打赏
  • 举报
回复
提供一个公共方法 让公共方法来访问私有成员 再通过参数传出去不就行了么...
zxa1334 2018-11-01
  • 打赏
  • 举报
回复
突然发现这个问题有点无聊,在C++语言中,三大特点分别是:封装性,多态,继承;而封装就是为了保证类的安全性,防止外部对私有成员的访问,而现在居然又有了好几种访问类中私有成员变量的方法,有点无语
LandyTan 2018-03-28
  • 打赏
  • 举报
回复
友元函数或友元类可以无视类的访问权限。
penghuahuijuan 2018-03-20
  • 打赏
  • 举报
回复
直接是不能访问的,定义一个公有函数来访问这个私有函数
缘来是梦 2018-03-19
  • 打赏
  • 举报
回复
设置成私有成员的目的就是不让外人随意的访问, 要么通过公有成员函数间接访问, 要么通过友元访问. 非要强行访问的话, 就只有黑客手段了, 我想这也不是你想问的吧!
Acuity. 2018-03-14
  • 打赏
  • 举报
回复
我来总结以上楼主的答案,方法一:类公共成员函数;方法二:友元函数。
AlbertS 2018-03-13
  • 打赏
  • 举报
回复
私有函数只能类的内部访问,如果需要其他的类访问,需要设置成友元函数,或者把其他类作为自己的友元类,网上搜索友元函数,会有很多例子的
百合杰 2018-03-13
  • 打赏
  • 举报
回复
一般的做法是成员变量私有的,然后用公有的成员函数去取(或修改)这个值

private:
	int m_i;
public:
	int getI()
	{
		return m_i;
	}
mk_lucifer 2018-03-12
  • 打赏
  • 举报
回复
声明友元,还有就是直接间接指针引用,不过问题是私有成员就是私有,目的就是不让别人访问,所以C++有点脱裤子放屁多此一举,所以你会发现C++以外的面向对象语言里,并没有友元。。。只要你想调用,迂回引用指针总是可以搬到,但私有的意义在哪了, 访问私有成员就不是面向对象编程的正常行为,有迫不得已的时候,但总是迫不得已,就要考虑考虑你的编程思路是不是存在问题。。。
mstlq 2018-03-12
  • 打赏
  • 举报
回复
可以使用友元,具体可以参考 http://zh.cppreference.com/w/cpp/language/friend
qq_40468027 2018-03-12
  • 打赏
  • 举报
回复
引用,友元
两个类外函数调用成员数据的方法
考拉一枚 2018-03-12
  • 打赏
  • 举报
回复
友元函数和友元类
donwmufromdying 2018-03-12
  • 打赏
  • 举报
回复
从OOP的原则来说,私有的就是私有的.本来就不应该被类外部访问.
zilaishuichina 2018-03-12
  • 打赏
  • 举报
回复
1、友元 假设class B中 要访问class A的私有成员

class A
{
	friend class B;
private :
	int m_a;
};

class B
{
public:
	void fun()
	{
		A a;
		a.m_a = 1; // 访问A的私有成员
	}
};
2、提供public 的 getter,setter

class A
{
public:
	int GetMemberA() { return m_a; }
	void SetMemberA(int a) { m_a = a; }
private:
	int m_a;
};

class B
{
public:
	void fun()
	{
		A a;
		a.SetMemberA(1);
	}
};
3、想办法拿到那个私有成员的地址,绕过访问权限控制符

class A;

typedef void (A::*Fun)();

class A
{
public:
	static Fun GetFun();

private:
	void process() { printf("process"); }
};

Fun A::GetFun()
{
	return &A::process;
}

class B
{
public:
	void process()
	{
		A a;
		(a.*A::GetFun())();
	}
};
仙境之桥2046 2016-03-15
  • 打赏
  • 举报
回复
友元类 或者提供公共接口,考虑数据安全的话.
Cqddq 2016-03-14
  • 打赏
  • 举报
回复
引用 6 楼 Saleayas的回复:
不要尝试访问 private 成员。 如果确实需要访问,而且可以保证访问没有错误。 那么仅仅需要欺骗一下编译器。 #define private public 然后包含你定义的类的头文件。 #undef private
你说的好深奥,能说细一点么?
nullptr 2016-03-14
  • 打赏
  • 举报
回复
你不干脆用struct算了
paschen 版主 2016-03-14
  • 打赏
  • 举报
回复
如果要在其他类中访问,可以用友元 如果要在类访问,那么建议写个公有的函数Get与Set,负责返回或设置该变量的值 如果类外要直接访问,你干嘛要设置成私有呢,改成公有不就行了
加载更多回复(6)
【为什么还需要学习C++?】 你是否接触很多语言,但从来没有了解过编程语言的本质?你是否想成为一名资深开发人员,想开发别人做不了的高性能程序?你是否经常想要窥探大型企业级开发工程的思路,但苦于没有基础只能望洋兴叹? 那么C++就是你个人能力提升,职业之路进阶的不二之选。【课程特色】 1.课程共19大章节,239课时内容,涵盖数据结构、函数、类、指针、标准库全部知识体系。2.带你从知识与思想的层面从0构建C++知识框架,分析大型项目实践思路,为你打下坚实的基础。3.李宁老师结合4大国外顶级C++著作的精华为大家推出的《征服C++11》课程。【学完后我将达到什么水平?】 1.对C++的各个知识能够熟练配置、开发、部署;2.吊打一切关于C++的笔试面试题;3.面向物联网的“嵌入式”和面向大型化的“分布式”开发,掌握职业钥匙,把握行业先机。【面向人群】 1.希望一站式快速入门的C++初学者; 2.希望快速学习 C++、掌握编程要义、修炼内功的开发者; 3.有志于挑战更高级的开发项目,成为资深开发的工程师。 【课程设计】 本课程包含3大模块基础篇本篇主要讲解c++的基础概念,包含数据类型、运算符等基本语法,数组、指针、字符串等基本词法,循环、函数、类等基本句法等。进阶篇本篇主要讲解编程常用的一些技能,包含类的高级技术、类的继承、编译链接和命名空间等。提升篇:本篇可以帮助学员更加高效的进行c++开发,其包含类型转换、文件操作、异常处理、代码重用等内容。

64,649

社区成员

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

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