Помогите найти ошибку в операторе ввода
Вкратце дали задание написать клас, чтобы работала main и проходила все юнит-тесты, но никак не могу разобраться как мне реализовать оператор ввода. Подскажите кто знает.
Выдает ошибку
отсутствует оператор ввода >> соответствующий этим операндам
.
istream& operator>>(istream& ist, Rational& r) {
return ist >> r.Numerator() >> r.Denominator();
}
В main всё вот так:
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;
}
Как вы могли понять нужно осуществить оператор ввода дробей.
Сам код:
#include <iostream>
#include <sstream>
using namespace std;
class Rational {
public:
Rational() {
p = 0;
q = 1;
};
Rational(int numerator, int denominator) {
if (numerator < 0 && denominator > 0) {
numerator = numerator * -1;
p = numerator / NOD(numerator, denominator);
q = denominator / NOD(numerator, denominator);
p *= -1;
}
else if (numerator > 0 && denominator < 0) {
denominator = denominator * -1;
p = numerator / NOD(numerator, denominator);
q = denominator / NOD(numerator, denominator);;
p *= -1;
}
else {
p = numerator / NOD(numerator, denominator);
q = denominator / NOD(numerator, denominator);
}
};
int Numerator() const {
return p;
};
int Denominator() const {
return q;
};
friend istream& operator>>(istream& ist, Rational& r);
private:
int NOD(int numerator, int denominator) {
while (numerator && denominator)if (numerator < denominator) denominator %= numerator; else numerator %= denominator;
return numerator + denominator;
};
int p;
int q;
};
int NOD(int numerator, int denominator) {
while (numerator && denominator)if (numerator < denominator) denominator %= numerator; else numerator %= denominator;
return numerator + denominator;
};
int NOK(int denominator_1, int denominator_2) {
if (denominator_1 < 0) denominator_1 *= -1;
if (denominator_2 < 0) denominator_2 *= -1;
return (denominator_1 / NOD(denominator_1, denominator_2)) * denominator_2;
}
bool& operator==(const Rational& r1, const Rational& r2) {
bool bl;
if (r1.Numerator() == r2.Numerator() && r1.Denominator() == r2.Denominator()) {
bl = true;
}
else {
bl = false;
}
return bl;
}
Rational& operator+(Rational& r1, Rational& r2) {
int pp, qq;
pp = (NOK(r1.Denominator(), r2.Denominator()) / r1.Denominator()) * r1.Numerator() + (NOK(r1.Denominator(), r2.Denominator()) / r2.Denominator()) * r2.Numerator();
qq = NOK(r1.Denominator(), r2.Denominator());
Rational r3(pp, qq);
return r3;
}
Rational& operator-(Rational& r1, Rational& r2) {
int pp, qq;
pp = (NOK(r1.Denominator(), r2.Denominator()) / r1.Denominator()) * r1.Numerator() - (NOK(r1.Denominator(), r2.Denominator()) / r2.Denominator()) * r2.Numerator();
qq = NOK(r1.Denominator(), r2.Denominator());
Rational r3(pp, qq);
return r3;
}
Rational& operator*(Rational& r1, Rational& r2) {
int pp, qq;
pp = r1.Numerator() * r2.Numerator();
qq = r1.Denominator() * r2.Denominator();
Rational r3(pp, qq);
return r3;
}
Rational& operator/(Rational& r1, Rational& r2) {
int pp, qq;
pp = r1.Numerator() * r2.Denominator();
qq = r1.Denominator() * r2.Numerator();
Rational r3(pp, qq);
return r3;
}
istream& operator>>(istream& ist, Rational& r) {
return ist >> r.Numerator() >> r.Denominator();
}
ostream& operator<<(ostream& ost, const Rational& r) {
ost << r.Numerator() << "/" << r.Denominator();
return ost;
}
int main() {
{
ostringstream output;
output << Rational(-6, 8);
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("");
Rational r;
bool correct = !(input >> r);
if (!correct) {
cout << "Read from empty stream works incorrectly" << endl;
return 3;
}
}
{
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 4;
}
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 5;
}
}
{
istringstream input1("1*2"), input2("1/"), input3("/4");
Rational r1, r2, r3;
input1 >> r1;
input2 >> r2;
input3 >> r3;
bool correct = r1 == Rational() && r2 == Rational() && r3 == Rational();
if (!correct) {
cout << "Reading of incorrectly formatted rationals shouldn't change arguments: "
<< r1 << " " << r2 << " " << r3 << endl;
return 6;
}
}
cout << "OK" << endl;
return 0;
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Для такого использования вот это
int Numerator() const {
return p;
};
int Denominator() const {
return q;
}
должно иметь вид
int& Numerator() {
return p;
};
int& Denominator() {
return q;
}
Но я бы делал иначе.
istream& operator>>(istream& ist, Rational& r) {
return ist >> r.p >> r.q;
}
Тем более что он у вас объявлен как friend.