Перегрузка вставки >> оператор? - PullRequest
3 голосов
/ 24 ноября 2011

Я только начал смотреть на структуры в C ++ и подумал, что мог бы попытаться выяснить, как перегрузить оператор вставки потока для объекта Линия (который сам содержит объекты Точка ). Я думаю, что мне нужно какое-то объявление о перегрузке в строке? а возможно точка? Я нашел несколько похожих вопросов, но, если честно, я вообще не могу этого понять.

Это очень простая программа, так что, надеюсь, кто-нибудь найдет время, чтобы взглянуть на нее и объяснить, как мне поступить?

#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 ]

6 голосов
/ 24 ноября 2011

Двоичные операторы могут быть определены как функции-члены, только если операнд first относится к типу класса. Поскольку это не так (первый операнд - std::istream&), вы должны определить функцию free :

class Foo;

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

Может быть полезно объявить эту функцию friend внутри вашего класса, чтобы она могла получить доступ к закрытым членам.

3 голосов
/ 24 ноября 2011

Вам необходимо объявить ваш operator>> как бесплатную функцию.Кроме того, код выглядит хорошо.

0 голосов
/ 24 ноября 2011

Вы не можете перегрузить оператор >> для ввода в качестве функции-члена , потому что ваши Line и Point находятся справа от оператора.Определенно глупая причина, но это просто природа синтаксиса.

Когда вы добираетесь до классов, это более важно, потому что ваши переменные, такие как p1.x, будут private, а выне будет в состоянии поместить их непосредственно в.

Кроме того, ваш const Line& line не должен быть const, потому что вы изменяете его, вводя его переменные!

...