【问题标题】:overloaded streams and arithmetic operations problem重载流和算术运算问题
【发布时间】:2011-05-10 23:38:14
【问题描述】:

我遇到了重载 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

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

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

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

可能是默认的operator=有问题,但是这个类中没有动态变量,所以不应该。

提前感谢您的帮助!

【问题讨论】:

  • 定义“停止运行”。你的意思是它崩溃了?锁了?不编译?
  • “停止运行”是什么意思?

标签: c++ operator-overloading stream


【解决方案1】:

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

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 正确性。

【讨论】:

  • operator+ 不能是 const,因为它是一个非成员函数,但无论如何它都能工作。感谢您的帮助。
  • @Phil:哦,是的。忘记注意了。
【解决方案2】:

试试

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() 设为常量!

【讨论】:

    【解决方案3】:

    临时对象不能绑定到非常量引用,只能绑定到常量引用。 operator&lt;&lt; 的重载采用非常量引用,因此它不适用于临时对象。它应该采用 const 引用的FuzzyNumber 代替:

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

    这另外意味着FuzzyNumberstreamWrite()getA()getC() 也应该被声明为常量。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-10
        • 1970-01-01
        • 1970-01-01
        • 2010-12-10
        • 2016-07-15
        相关资源
        最近更新 更多