Не знаю каким образом перегрузить оператор ввода
в программа должна проверить правильность перегрузки ввода и вывода потоков, классу передаётся 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
→ Ссылка
operator>>будет записывать данные в обьект, поэтому необходимо убрать квалификаторconstу параметраr.- У Вас члены
pиqобьвлены какpublic. Это значит, что весь внешний мир имеет к ним доступ и может изменять их. Это, как минимум, усложнит дальнейшую отладку кода и поиск ошибок. Возможно, имеет смысл обьявитьpиqкакprivateи обьявить операторы какfriend.