перегруженные потоки и проблема арифметических операций - PullRequest
0 голосов
/ 16 ноября 2010

У меня проблема с перегруженным оператором + и потоком <<.У меня есть класс с перегруженными операторами: </p>

FuzzyNumber& FuzzyNumber::add(FuzzyNumber B)
{
    FuzzyNumber fuzzyResult;

    fuzzyResult.setA(this -> getA() + B.getA() );
    fuzzyResult.setB(this -> getB() + B.getB() );
    fuzzyResult.setC(this -> getC() + B.getC() );

    return fuzzyResult;
}

FuzzyNumber& operator+(FuzzyNumber& A, FuzzyNumber& B)
{
    return A.add(B);
}

All fields inside class are double type. Here is overloaded ostream operator>>

ostream& FuzzyNumber::streamWrite(ostream& outStream)
{
    outStream << "( "
              << this -> getA() << ", "
              << this -> getB() << ", "
              << this -> getC() << ")";

    return outStream;
}



ostream& operator<< (ostream& outStream, FuzzyNumber& fuzzyNumber)
{
    fuzzyNumber.streamWrite(outStream);
    return outStream;
}

Намерено напечатать что-то подобное (3, 4.3, 5.1), когда я наберу cout << fuzzyNumber ;.Он работает нормально, более того, он также отлично работает: </p>

FuzzyNumber fuzzyNumber = numA + numB;
cout << "A + B = " << fuzzyNumber << endl;

, где numA и numB - это типы FuzzyNumber.Хотя программа перестает работать, когда я заменяю указанную выше строку следующим образом:

cout << "A + B = " << (numA + numB) << endl;

Возможно, что-то не так с оператором по умолчанию =, но в этом классе нет динамических переменных, поэтому не должно.

Заранее спасибо за помощь!

Ответы [ 4 ]

3 голосов
/ 16 ноября 2010

Внутри оператора + вы вернули ссылку на переменную стека.Ваш компилятор должен был предупредить вас об этом очевидном случае.

FuzzyNumber FuzzyNumber::add(FuzzyNumber B) const
{
    FuzzyNumber fuzzyResult;

    fuzzyResult.setA(this -> getA() + B.getA() );
    fuzzyResult.setB(this -> getB() + B.getB() );
    fuzzyResult.setC(this -> getC() + B.getC() );

    return fuzzyResult;
}

FuzzyNumber operator+(const FuzzyNumber& A, const FuzzyNumber& B)
{
    return A.add(B);
}

Этот код должен решить вашу проблему.Я также добавил правильную константную корректность.

1 голос
/ 16 ноября 2010

Попробуйте

FuzzyNumber FuzzyNumber::add(FuzzyNumber const &B) const
{
  FuzzyNumber fuzzyResult;

  fuzzyResult.setA(this -> getA() + B.getA() );
  fuzzyResult.setB(this -> getB() + B.getB() );
  fuzzyResult.setC(this -> getC() + B.getC() );

  return fuzzyResult;
}


FuzzyNumber operator+(FuzzyNumber const & A, FuzzyNumber const & B)
{
  FuzzyNumber res(A);
  res.add(B);
  return res;
}

и

ostream& operator<< (ostream& outStream, FuzzyNumber const & fuzzyNumber)
{
    fuzzyNumber.streamWrite(outStream);
    return outStream;
}

Имейте в виду, что вы должны сделать свой FuzzyNumber :: streamWrite () const!

0 голосов
/ 16 ноября 2010

Ваша функция add возвращает ссылку на локальный объект, который перестает существовать, вызывая неопределенное поведение.Чтобы избежать этого, функция add должна возвращаться по значению.

0 голосов
/ 16 ноября 2010

Временные ссылки не могут быть привязаны к неконстантным ссылкам, только к постоянным. Перегрузка operator<< принимает неконстантную ссылку, поэтому она не работает для временных. Вместо этого следует взять ссылку FuzzyNumber на const :

ostream& operator<< (ostream& outStream, const FuzzyNumber& fuzzyNumber) {
   ...
}

Это также означает, что FuzzyNumber streamWrite() и getA() - getC() также должны быть объявлены константами.

...