我遇到了重载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;
其中numA
和numB
是FuzzyNumber类型。
虽然当我用以下内容替换上面的行时程序停止运行:
cout << "A + B = " << (numA + numB) << endl;
默认运算符=可能有问题,但此类中没有动态变量,所以不应该。
提前感谢您的帮助!
答案 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
函数应该按值返回以避免这种情况。