重载插入>>运营商?

时间:2011-11-24 13:42:04

标签: c++ input struct

我刚刚开始在C ++中查看结构,并认为我可能会尝试找出如何重载流插入运算符以获取 Line 的对象(其本身包含 Point <的对象/ em>的)。我想我需要在Line中进行某种重载声明?可能点?我发现了一些类似的问题,但说实话,我根本无法理解。

这是一个非常简单的程序,所以希望有人可以花时间看一下并向我解释我应该怎么做呢?

#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::istream;

//define Point & Line type
struct Point{
    float x, y;
};
struct Line{
    Point p1, p2;
    istream& operator>>( istream& in, const Line& line); //something like this here?
};
//function declarations
Point calcMidpoint(const Line& rline);

//operator overload
istream& operator>>( istream& in, const Line& line){
    in >> line.p1.x >> line.p1.y >> line.p2.x >> line.p2.y;
    return in;
}

//MAIN
int main(){
    Line line;
    cout << "please enter one pair of x and y values followed by another like so (x1 y1 x2 y2): ";
    cin >> line;
    //get midpoint of line
    Point mp;
    mp = returnMidpoint(line);
    cout << "The Midpoint is.. (" << mp.x << " " << mp.y << ")" <<endl;

    return 0;
}

//can be used in a large expression at the expence of creating temp instances
Point calcMidpoint(const Line& rline){
    Point midpoint;
    midpoint.x = (rline.p2.x + rline.p1.x) / 2;
    midpoint.y = (rline.p2.y + rline.p1.y) / 2;
    return midpoint;
}

3 个答案:

答案 0 :(得分:6)

如果第一个操作数属于类的类型,则只能将二元运算符定义为成员函数。由于情况并非如此(第一个操作数为std::istream&),您必须定义 free 函数:

class Foo;

std::istream & operator>>(std::istream & is, Foo & x)
{
  //...
  return is;
}

在您的类中声明此函数为friend以便它可以访问私有成员可能很有用。

答案 1 :(得分:3)

您需要将operator>>声明为免费功能。除此之外,代码看起来还不错。

答案 2 :(得分:0)

由于您的>>Line位于运营商的右侧,因此您无法使输入Point运算符超载为成员函数。绝对是一个愚蠢的原因,但这只是语法的本质。

当您上课时,这一点更为重要,因为您的变量(例如p1.x)将为private,您将无法直接将它们放入。

此外,您的const Line& line不应该是const,因为您正在通过输入变量来更改它!