2013-11-02 2 views
0

Я новичок в 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 

Все правильные результаты ...

Это сбило меня с ума. Я искал часы, но не нашел решение или кого-то, у кого была такая же проблема. Было бы очень хорошо, если бы кто-нибудь мог мне помочь. Спасибо, ребята.

+0

Вероятно, не следует перегружать оператора <<, это приводит к большой двусмысленности для всех, кто пытается прочитать код. Вы должны определить функцию 'print()' внутри Frac, которая записывает то, что вы хотите использовать cout. –

+0

@ZachStark Это вариант, но я действительно хотел найти проблему, мне было бы плохо, если бы просто обойти это: p Спасибо! – mebs

ответ

4
Fract& operator+(Fract const& a, Fract const& b){ 
    Fract copy(a); 
    ... 
    return copy; 
} 

Вы возвращаете ссылку на локальную переменную, но по истечении этой переменной все данные исчезли. Вы должны возвращать по значению:

Frac operator+(...) 
+0

+1 Примечание к ОП. Стандартные операторы '+' и '-' и т. Д. Обычно возвращают по значению конструкции полученной операции; не ссылки. Операторы накопления '+ =', '- =' и т. Д. - это те, которые обычно возвращают такие ссылки, но будьте осторожны при этом. (и хороший ответ, сэр). – WhozCraig

+0

О, мой бог ... Большое спасибо! Вы сделали это ясно и коротко: D Должен ли я удалить этот пост? @WhozCraig Спасибо за подробности :) – mebs

+0

@mebs № Если ваша проблема решена, вы * принимаете * ответ, который, по вашему мнению, помог вам больше всего. :) – 0x499602D2

Смежные вопросы