Я новичок в C++, и, как практика, я сделал класс фракций «Frac». Кажется, что все работает нормально, за исключением случаев, когда я хочу напечатать результат операций типа (a + b), a и b, которые являются объектами Frac. В моей основной функции, я использую:Операторы перегружают странный вывод
Frac a(5, 2), b(9, 2), c(a+b); //Three fractions a=5/2, b=9/2, and c = a+b = 14/2 = 7/1
cout << (a+b) << endl; //This line's result makes no sense to me : always 2686600/4201035
cout << c << endl; //This line's result is ok : 7/1
Вот как я перегружен оператор < <:
ostream& operator<<(ostream &stream, Fract const& a){
stream << a.getNum() << "/" << a.getDenom(); //Num is numerator of fraction a, Denom is its denominator
return stream;
}
оператор +:
Fract& operator+(Fract const& a, Fract const& b){
Fract copy(a);
copie += b;
return copy;
}
оператор + =:
Fract& Fract::operator+=(Fract const& b){
Fract copy(b);
//Put on same denominator for add
copy.m_denom *= m_denom;
copy.m_num *= m_denom;
m_denom *= b.m_denom;
m_num *= b.m_denom;
//Now on same denominator
m_num += copy.m_num;
Fract::simplify();
return *this;
}
Газопоглотителей:
int Fract::getDenom() const{return m_denom;}
int Fract::getNum() const{return m_num;}
Когда я отладка программы, все нормально до этой линии в операторе < <:
stream << a.getNum() << "/" << a.getDenom();
Перед его исполнения, значение a.m_num и a.m_denom являются good (7 и 1, проверено с помощью отладчика), но после первого вызова (a.getDenom() здесь), a.m_num и a.m_denom переключаются с 7 и 1 до 2686600 и 4201035! Это то же самое, независимо от оператора, так что ...
Fract a(5,2), b(9,2);
cout << (a+b) << endl << (a*b) << endl << (a/b) << endl << (a-b);
... s выход:
2686600/4201035
2686600/4201035
2686600/4201035
2686600/4201035
и ...
Fract a(5,2), b(9,2), c(a+b), d(a*b), e(a/b), f(a-b);
cout << c << endl << d << endl << e << endl << f;
... Выходной сигнал:
7/1
45/4
5/9
-2/1
Все правильные результаты ...
Это сбило меня с ума. Я искал часы, но не нашел решение или кого-то, у кого была такая же проблема. Было бы очень хорошо, если бы кто-нибудь мог мне помочь. Спасибо, ребята.
Вероятно, не следует перегружать оператора <<, это приводит к большой двусмысленности для всех, кто пытается прочитать код. Вы должны определить функцию 'print()' внутри Frac, которая записывает то, что вы хотите использовать cout. –
@ZachStark Это вариант, но я действительно хотел найти проблему, мне было бы плохо, если бы просто обойти это: p Спасибо! – mebs