[提问]关于重载 <<

beyonddream2008 2009-04-27 08:13:12
请看下面的代码

class Complex
{
public:
Complex(){real=0;imag=0;}
Complex(double r,double i){real=r;imag=i;}
Complex operator+(Complex &c2);
friend ostream& operator<< (ostream&,Complex&);
private:
double real;
double imag;
};
Complex Complex::operator+(Complex &c2)
{
return Complex(real+c2.real,image+c2.imag);
}
ostream& operator << (ostream &output,Complex &c)
{
output<<c.real<<"+"<<c.imag<<endl;
return output;
}
int main()
{
Complex c1(2,4),c2(6,10),c3;
c3=c1+c2;
cout<<c3;
return 0;
}

这是c++程序设计中的例题
我编译了一下,出现下面的错误
1: error C2248: 'real' : cannot access private member declared in class 'Complex'
D:\f\F\C++_programs\p2\class_test\calss_test\class_test.cpp(206) : see declaration of 'real'
2: error C2248: 'image' : cannot access private member declared in class 'Complex'
D:\f\F\C++_programs\p2\class_test\calss_test\class_test.cpp(207) : see declaration of 'imag'
3:error C2593: 'operator <<' is ambiguous
Error executing cl.exe.
这是怎么回事?向大牛求教
还有如果在类内实现运算符重载,即重载函数作为成员函数如何实现?
...全文
159 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
longhuishen 2009-04-28
  • 打赏
  • 举报
回复
VC的BUG,两种解决方法

#include<iostream>
using namespace std;

改为:
#include<iostream.h>

或者


#include<iostream>
using namespace std;
后面加一句
class Complex;
ostream& operator<< (ostream&,Complex&);
即:
#include<iostream>
using namespace std;
class Complex;
ostream& operator<< (ostream&,Complex&);
class Complex
{
public:
Complex(){real=0;imag=0;}
Complex(double r,double i){real=r;imag=i;}
Complex operator+(Complex &c2);
friend ostream& operator<< (ostream&,Complex&);
private:
double real;
double imag;
};
Complex Complex::operator+(Complex &c2)
{
return Complex(real+c2.real,imag+c2.imag);
}
ostream& operator << (ostream &output,Complex &c)
{
output<<c.real<<"+"<<c.imag<<endl;
return output;
}
int main()
{
Complex c1(2,4),c2(6,10),c3;
c3=c1+c2;
cout<<c3;
return 0;
}


风起云涌5800 2009-04-27
  • 打赏
  • 举报
回复
加上头文件就可以了,在VC6.0中编译通过。

#include <iostream.h>
hjjdebug 2009-04-27
  • 打赏
  • 举报
回复
vc6 下编译,没有问题,你可能头文件包含不对
参考以下代码。
另外,<< 不能成为类成员函数。因为它的左值是cout
重载 < <时编译器怎么报错二进制operator的参数太多,这是怎么回事呢?
因为没有加friend

#pragma warning(disable:4786)

#include <iostream>
using namespace std;

class Complex
{
public:
Complex(){real=0;imag=0;}
Complex(double r,double i){real=r;imag=i;}
Complex operator+(Complex &c2);
ostream& operator <<(Complex);
friend ostream& operator << (ostream &output,Complex &c)
{
output<<c.real<<"+"<<c.imag<<endl;
return output;
}

private:
double real;
double imag;
};
Complex Complex::operator+(Complex &c2)
{
return Complex(real+c2.real,imag+c2.imag);
}
int main()
{
Complex c1(2,4),c2(6,10),c3;
c3=c1+c2;
cout<<c3;
return 0;
}
goodname 2009-04-27
  • 打赏
  • 举报
回复
http://www.lslnet.com/linux/dosc1/32/linux-251783.htm
goodname 2009-04-27
  • 打赏
  • 举报
回复
http://faq.csdn.net/read/167315.html
beyonddream2008 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 pengzhixi 的回复:]
引用 5 楼 beyonddream2008 的回复:
引用 1 楼 pengzhixi 的回复:
Complex():real(0.0),imag(0.0){}
你的是vc6.0的编译器吧。换个编译器吧

请问如果把重载函数作为成员函数的话,该如何实现呢?


你是要将哪个函数做为成员函数呢?
[/Quote]
插入运算符<<啊
pengzhixi 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 beyonddream2008 的回复:]
引用 1 楼 pengzhixi 的回复:
Complex():real(0.0),imag(0.0){}
你的是vc6.0的编译器吧。换个编译器吧

请问如果把重载函数作为成员函数的话,该如何实现呢?
[/Quote]

你是要将哪个函数做为成员函数呢?
lingyin55 2009-04-27
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20011129/16/394892.html


[Quote=引用 10 楼 beyonddream2008 的回复:]
引用 8 楼 hairetz 的回复:
Complex Complex::operator+(Complex &c2)
{
return Complex(real+c2.real,image+c2.imag);
}
ostream& operator < < (ostream &output,Complex &c)
{
output < <c.real < <"+" < <c.imag < <endl;
return output;
}


把重载符号的定义跟声明一起,放在类体里。VC6支持友元不够好

“+”运算符重载我知道怎么做,就是不明白“ < <”怎么在类内定义重载函数
重…
[/Quote]
beyonddream2008 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 hairetz 的回复:]
Complex Complex::operator+(Complex &c2)
{
return Complex(real+c2.real,image+c2.imag);
}
ostream& operator < < (ostream &output,Complex &c)
{
output < <c.real < <"+" < <c.imag < <endl;
return output;
}


把重载符号的定义跟声明一起,放在类体里。VC6支持友元不够好
[/Quote]
“+”运算符重载我知道怎么做,就是不明白“<<”怎么在类内定义重载函数
重载<<时编译器怎么报错二进制operator的参数太多,这是怎么回事呢?
liliangbao 2009-04-27
  • 打赏
  • 举报
回复
试一试LS的做法~
  • 打赏
  • 举报
回复
Complex Complex::operator+(Complex &c2)
{
return Complex(real+c2.real,image+c2.imag);
}
ostream& operator << (ostream &output,Complex &c)
{
output<<c.real<<"+"<<c.imag<<endl;
return output;
}


把重载符号的定义跟声明一起,放在类体里。VC6支持友元不够好
lingyin55 2009-04-27
  • 打赏
  • 举报
回复
vs2008下运行通过
输出
8+14
请按任意键继续. . .



#include <iostream>
using namespace std;

class Complex
{
public:
Complex(){real=0;imag=0;}
Complex(double r,double i){real=r;imag=i;}
Complex operator+(Complex &c2);
friend ostream& operator<<(ostream&,Complex&);
private:
double real;
double imag;
};
Complex Complex::operator+(Complex &c2)
{
return Complex(real+c2.real,imag+c2.imag);////////////
}
ostream& operator << (ostream &output,Complex &c)
{
output<<c.real<<"+"<<c.imag<<endl;
return output;
}
int main()
{
Complex c1(2,4),c2(6,10),c3;
c3=c1+c2;
cout<<c3;
return 0;
}
beyonddream2008 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 goodname 的回复:]
return Complex(real+c2.real,image+c2.imag);
<---
return Complex(real+c2.real,imag+c2.imag);


vs2008没有发现楼主的错误
[/Quote]
请问如果把重载函数作为成员函数的话,该如何实现呢?
beyonddream2008 2009-04-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]
Complex():real(0.0),imag(0.0){}
你的是vc6.0的编译器吧。换个编译器吧
[/Quote]
请问如果把重载函数作为成员函数的话,该如何实现呢?
mengde007 2009-04-27
  • 打赏
  • 举报
回复
return Complex(real+c2.real,image+c2.imag);
写错了
return Complex(real+c2.real,imag+c2.imag);
lingyin55 2009-04-27
  • 打赏
  • 举报
回复
换个编译器应该就没问题了。
goodname 2009-04-27
  • 打赏
  • 举报
回复
return Complex(real+c2.real,image+c2.imag);
<---
return Complex(real+c2.real,imag+c2.imag);


vs2008没有发现楼主的错误
pengzhixi 2009-04-27
  • 打赏
  • 举报
回复
Complex():real(0.0),imag(0.0){}
你的是vc6.0的编译器吧。换个编译器吧

65,210

社区成员

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

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