重载错误<<运营商在cpp?不知道为什么?

时间:2014-04-24 18:49:56

标签: c++ class operator-overloading

这是我的完整代码,除<<重载外,一切正常。 任何人都可以告诉我为什么在>>工作正常时会产生错误任何形式的帮助都将不胜感激。

  

错误“请参阅&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;
}

2 个答案:

答案 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";