这是我的完整代码,除<<
重载外,一切正常。
任何人都可以告诉我为什么在>>
工作正常时会产生错误任何形式的帮助都将不胜感激。
错误“请参阅&lt;&lt;”
的声明
#include<iostream>
#include<conio.h>
using namespace std;
class point
{
private:
int x,y;
public:
point(int x=0, int y=0)
{
this->x = x;
this->y = y;
}
point & operator + (const point &obj)
{
point temp;
temp.x = this->x + obj.x;
temp.y = this->y + obj.y;
return temp;
}
point & operator - (const point &obj)
{
point temp;
temp.x = this->x - obj.x;
temp.y = this->y - obj.y;
return temp;
}
friend point & operator >>(istream in, point obj);
friend point & operator <<(ostream out, point obj);
};
void main()
{
_getch();
}
point & ::operator >> (istream in, point obj)
{
in >> obj.x;
in >> obj.y;
return obj;
}
point & ::operator << (istream out, point obj) // <--- Here is the Problem
{
//out << "( " << obj.x << " , " << obj.y << " )";
return obj;
}
答案 0 :(得分:1)
您应该始终返回流参考,而不是点参考。
更新:我认为其他人在评论中指出了实际问题(istream而不是ostream)。此外,您按值而不是按引用传递流。以下是您的代码应该是什么样的:
istream& ::operator >> (istream &in, const point &obj)
{
in >> obj.x;
in >> obj.y;
return in;
}
ostream& ::operator << (ostream &out, const point &obj) // <--- Here is the Problem
{
out << "( " << obj.x << " , " << obj.y << " )";
return out;
}
更新到我的更新: 我也会说点值应该作为const引用传递,否则你将永远无法传递一个恒定的点值(假设你想要)。请参阅上面的编辑内容。
还有一点(不太相关): 除非你必须,否则尽量不要让他们成为Point的朋友。似乎x和y值在某些时候需要公开访问。如果他们可以公开访问,那么运营商就没有理由成为朋友。
答案 1 :(得分:1)
该函数被声明为采用ostream
,但定义为采用istream
。那是错误。
但是,这里有几个问题。
建议的重载采用以下形式:
ostream& operator<<(ostream& os, const point& p)
{
os << "(" << p.x << "," << p.y << ")";
return os;
}
您现在可以执行以下操作:
point x;
point y;
// ...
std::cout << x << " and " << y << "\n";