重载流和算术运算问题

时间:2010-11-16 17:57:06

标签: c++ operator-overloading stream

我遇到了重载operator +和stream<<的问题。我有重载运算符的类:

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;
}

当我输入cout&lt;&lt;时,打算打印类似的东西(3,4.3,5.1)。 fuzzyNumber ;.它工作正常,此外这也很好:

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

其中numAnumB是FuzzyNumber类型。 虽然当我用以下内容替换上面的行时程序停止运行:

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

默认运算符=可能有问题,但此类中没有动态变量,所以不应该。

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:3)

在内部运算符+中,您返回了对堆栈变量的引用。你的编译器应该警告你这个明显​​的例子。

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);
}

此代码可以解决您的问题。我还添加了一些正确的const正确性。

答案 1 :(得分:1)

尝试

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!

答案 2 :(得分:0)

Temporaries不能绑定到非const引用,只能绑定到常量引用。 operator<<的重载采用非const引用,因此它不适用于临时值。它应该采用FuzzyNumber const 引用:

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

这另外意味着FuzzyNumber的{​​{1}}和streamWrite()getA()也应声明为常量。

答案 3 :(得分:0)

您的add函数返回对将停止存在的本地的引用,从而导致未定义的行为。 add函数应该按值返回以避免这种情况。