类的友元函数为啥访问不了类的私有数据成员?

sjk1996 2016-11-13 08:16:25
用单链表表示多项式,设置了一个结点类Term表示单项,链表类Polynomial表示多项式,链表类为结点类的友元类;
然后写了函数ostream& operator<< (ostream& ostr,Polynomial& x)作为多项式类的友元函数来实现对多项式类的输出重载操作,
里面有一句代码为Term* current=x.getHead()->Link;使指针指向多项式x的首元结点,但是系统报错,我想应该是因为友元类的友元函数不能像共有函数一样访问友元的私有数据成员,于是把输出重载函数也声明为Term类的友元函数,但是系统仍然报错,

这是什么原因,请帮我解答一下,谢谢
...全文
579 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
归零起步 2018-08-31
  • 打赏
  • 举报
回复
一般情况建议不用 using namespace std;
建议写成:friend std::istream& operator>>(std::istream& istr, Polynominal &x) , 另外重载>>时,第二个形参不应该为const,因为既然是读入,对象内容肯定会有所变化,所以不应该写为 const
060 2016-11-14
  • 打赏
  • 举报
回复
你的描述了涉及了两个类 链表类结点类,一个友元函数 operator<<,你需要确定友元函数是哪个类的友元?? 友元破坏了封装。建议尽量避免友元类、友元函数的使用,将需要的类成员,封装为方法进行公开。
AlbertS 2016-11-14
  • 打赏
  • 举报
回复
应该可以啊,把代码站出来看一下吧
paschen 版主 2016-11-14
  • 打赏
  • 举报
回复
提供你精简后的代码.
Ouyang_Lianjun 2016-11-14
  • 打赏
  • 举报
回复
另外参数也要保持一致,声明时是什么样子,定义时就是什么样子
Ouyang_Lianjun 2016-11-14
  • 打赏
  • 举报
回复
我看了你的代码,发现你是希望Term类去访问Polynomia类的成员,这个时候你应该是把Term类声明为Polynomia类的友元类才是正确的,我下面给出一个友元类的例子:
运行环境:vs2013
#include<iostream>
using namespace std;

class Student;
class Teacher{
//希望Teacher类访问Student类的成员
public:
void print(Student & a);
};
class Student{
private:
//把Teacher类声明为Student类的友元类
friend Teacher;
int age;
public:
Student(int age)
{
this->age = age;
}

};
void Teacher::print(Student & a){
cout << a.age << endl;
}

void main(){
Student a(10);
Teacher t;
t.print(a);
system("pause");
}

输出结果:
小灸舞 2016-11-14
  • 打赏
  • 举报
回复
理论上是可以访问的,注意是通过类名.函数名调用。首先看一看是不是自己语法有问题。

或者就是编译器有问题,可以在其他编译器上编译试试看,要将错误定位,是自己写的程序问题还是编译器的问题。
iyomumx 2016-11-14
  • 打赏
  • 举报
回复
一个是 Polynomial& 一个是 const Polynomial& ,这两个函数形成重载,不被认为是同一个函数
ArthurJava 2016-11-14
  • 打赏
  • 举报
回复
不应该是
cout << "+" 
sjk1996 2016-11-14
  • 打赏
  • 举报
回复
友元函数不是类的成员,把它放在私有和公有权限里都可以。
sjk1996 2016-11-14
  • 打赏
  • 举报
回复
代码已经贴出来了,问题出在哪里?
sjk1996 2016-11-14
  • 打赏
  • 举报
回复


lsfv001 2016-11-14
  • 打赏
  • 举报
回复
引用 5 楼 lsfv001 的回复:
应该是可以的啊。 [quote=引用 4 楼 60 的回复:] 你的描述了涉及了两个类 链表类结点类,一个友元函数 operator<<,你需要确定友元函数是哪个类的友元?? 友元破坏了封装。建议尽量避免友元类、友元函数的使用,将需要的类成员,封装为方法进行公开。
为什么友元是破坏? 我的理解。友元是封装的具体表现。 如果公开?破坏的不是更大? [/quote] 思考一下。我说的武段了。 如果友元只需要只读数据。应该是public更好。 不过如果这个public只是给友元用,那不是也破坏了? 有没有控制友元函数对成员的读写控制?
lsfv001 2016-11-14
  • 打赏
  • 举报
回复
应该是可以的啊。
引用 4 楼 60 的回复:
你的描述了涉及了两个类 链表类结点类,一个友元函数 operator<<,你需要确定友元函数是哪个类的友元?? 友元破坏了封装。建议尽量避免友元类、友元函数的使用,将需要的类成员,封装为方法进行公开。
为什么友元是破坏? 我的理解。友元是封装的具体表现。 如果公开?破坏的不是更大?

64,654

社区成员

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

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