Не знаю каким образом перегрузить оператор ввода

в программа должна проверить правильность перегрузки ввода и вывода потоков, классу передаётся 2 значения из которых он формирует рациональную дробь. << не определен для данных операндов. пробовал подавать на ввод просто переменную класса, но там "исключение не обратно"

    #include <iostream>
#include <sstream>
using namespace std;
int Nod(int n1, int n2) {
    while (n1 != n2)
    {
        if (n1 > n2) {
            n1 -= n2;
        }
        else {
            n2 -= n1;
        }
    }
    return n1;
}
class Rational {
public:
    Rational() {
        p = 0;
        q = 1;
    }

    Rational(int first, int second) {
        
        if (first == 0) {
            p = 0;
            q = 1;
        }
        else {
            int x = first, y = second;
            int n1 = x, n2 = y;

            if (x < 0)
                n1 = -x;
            if (y < 0)
                n2 = -y;

            int nod = Nod(n1, n2);

            if ((x > 0 && y < 0) || (x < 0 && y < 0)) {
                p = -x / nod;
                q = -y / nod;
            }
            if (y > 0 && x != 0) {
                p = x / nod;
                q = y / nod;
            }
        }

    }
    friend ostream& operator<< (ostream& stream, const Rational& r);
    int p;
    int q;
};
bool operator== (const Rational& lhs, const Rational& rhs) {
    bool test;
    test = lhs.p == rhs.p && lhs.q == rhs.q;
    return test;
}
istream& operator>> (istream& stream, const Rational& r) {
    stream >> r.p >> r.q; // оператор >> здесь не работает как исправить, 
    return stream;        // чтобы в вводил 2 значения ?
}
ostream& operator<< (ostream& stream, const Rational& r) {
    stream << r.p << "/" << r.q;
    return stream;
}

int main() {
    {
        ostringstream output;
        Rational r = Rational(-6, 8);
        output << r;
        
        if (output.str() != "-3/4") {
            cout << "Rational(-6, 8) should be written as \"-3/4\"" << endl;
            return 1;
        }
    }

    {
        istringstream input("5/7");
        Rational r;
        input >> r;
        bool equal = r == Rational(5, 7);
        if (!equal) {
            cout << "5/7 is incorrectly read as " << r << endl;
            return 2;
        }
    }

    {
        istringstream input("5/7 10/8");
        Rational r1, r2;
        input >> r1 >> r2;
        bool correct = r1 == Rational(5, 7) && r2 == Rational(5, 4);
        if (!correct) {
            cout << "Multiple values are read incorrectly: " << r1 << " " << r2 << endl;
            return 3;
        }

        input >> r1;
        input >> r2;
        correct = r1 == Rational(5, 7) && r2 == Rational(5, 4);
        if (!correct) {
            cout << "Read from empty stream shouldn't change arguments: " << r1 << " " << r2 << endl;
            return 4;
        }
    }

    cout << "OK" << endl;
    return 0;
}

Ответы (1 шт):

Автор решения: EOF
  1. operator>> будет записывать данные в обьект, поэтому необходимо убрать квалификатор const у параметра r.
  2. У Вас члены p и q обьвлены как public. Это значит, что весь внешний мир имеет к ним доступ и может изменять их. Это, как минимум, усложнит дальнейшую отладку кода и поиск ошибок. Возможно, имеет смысл обьявить p и q как private и обьявить операторы как friend.
→ Ссылка