友员和重载的问题

hujunsong 2009-07-22 11:20:29
声名了友员,为什么编译出错,提示无法访问私有数据成员

//OpOverclass.h

#include<iostream>

using namespace std;

class OpOverClass
{
friend ostream& operator<<(ostream&,const OpOverClass&);
friend istream& operator>>(istream&, OpOverClass&);
public:
void print()const;
OpOverClass operator+(const OpOverClass&)const;
OpOverClass operator*(const OpOverClass&)const;
OpOverClass(int i=0,int j=0);
private:
int a;
int b;
};

//OpOverClass.cpp

#include<iostream>
#include"OpOverClass.h"

using namespace std;

void OpOverClass::print()const
{
cout<<"("<<a<<","<<b<<")"<<endl;
}

OpOverClass OpOverClass::operator +(const OpOverClass& right)const
{
OpOverClass temp;

temp.a=a+right.a;
temp.b=b+right.b;

return temp;
}

OpOverClass OpOverClass::operator *(const OpOverClass& right)const
{
OpOverClass temp;

temp.a=a*right.a;
temp.b=b*right.b;

return temp;
}

OpOverClass::OpOverClass(int i,int j)
{
a=i;
b=j;
}

ostream& operator<<(ostream& osObject,const OpOverClass& right)
{
osObject<<"("<<right.a<<","<<right.b<<")";
return osObject;
}

istream& operator>>(istream& isObject,OpOverClass& right)
{
isObject>>right.a>>right.b;
return isObject;
}

//main.cpp

#include<iostream>
#include"OpOverClass.h"

using namespace std;

int main()
{
OpOverClass u(23,45);
OpOverClass v(12,10);
OpOverClass w;
OpOverClass w1;
OpOverClass w2;

cout<<"u= ";
u.print();
cout<<endl;

cout<<"v= ";
v.print();
cout<<endl;


w1=u+v;

cout<<"w1= ";
w1.print();
cout<<endl;

w2=u*v;

cout<<"w2= ";
w2.print();
cout<<endl;

cout<<"Enter two integers: ";
cin>>w;
cout<<w<<endl;


return 0;
}


...全文
123 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
藏羚羊 2009-07-24
  • 打赏
  • 举报
回复
我觉得私有成员还是应该用get()方法获得。。
  • 打赏
  • 举报
回复
你是VC6编译器吗?
如果是的,那frined 函数的声明跟定义都要在类体里,不然会无法访问private成员,是bug来的。
zgjxwl 2009-07-24
  • 打赏
  • 举报
回复
http://blog.csdn.net/zgjxwl/archive/2008/10/13/3067973.aspx
taodm 2009-07-24
  • 打赏
  • 举报
回复
哎,珍惜生命,远离VC6
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 hujunsong 的回复:]
谢谢,试了,奏效
请问楼上,这是在定义前声名吗,这样做的理论依据是?
[/Quote]
避免VC6的bug而已.

在比较新的编译器你的代码直接能编译过去.
akira88 2009-07-22
  • 打赏
  • 举报
回复
你的友元函数没有在头文件中声明,对于main.cpp来说,它并不是可见的
hujunsong 2009-07-22
  • 打赏
  • 举报
回复
请问 一楼,理论依据是什么
hujunsong 2009-07-22
  • 打赏
  • 举报
回复
谢谢,试了,奏效
请问楼上,这是在定义前声名吗,这样做的理论依据是?
yangkunhenry 2009-07-22
  • 打赏
  • 举报
回复
没错误吧……
  • 打赏
  • 举报
回复
OpOverclass.h 修改一下

//OpOverclass.h

class OpOverClass;
ostream& operator <<( ostream&,const OpOverClass& );
istream& operator>>( istream&, OpOverClass& );
class OpOverClass
{
friend ostream& operator <<( ostream&,const OpOverClass& );
friend istream& operator>>( istream&, OpOverClass& );
public:
void print()const;
OpOverClass operator+( const OpOverClass& )const;
OpOverClass operator*( const OpOverClass& )const;
OpOverClass( int i=0,int j=0 );
private:
int a;
int b;
};

64,646

社区成员

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

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