2010-11-16 49 views
0

我有重載的operator +和流< <問題。我有類重載操作符:重載流和算術運算問題

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 ;.它工作正常,而且這也能正常工作:

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

其中numAnumB是FuzzyNumber類型。 儘管程序停止的時候我這個替換上面一行運行:

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

也許這是什麼毛病默認運算符=,但目前還沒有動態變量在這個類中,所以它不應該。

感謝您的幫助!

+1

定義「停止運行」。你的意思是它崩潰了嗎?鎖定?不編譯? – 2010-11-16 18:00:40

+0

「停止運行」是什麼意思? – Cascabel 2010-11-16 18:01:13

回答

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

運算符+不能是const,因爲它是一個非成員函數,但它仍然可以工作。感謝幫助。 – Overpain 2010-11-16 18:40:29

+0

@菲爾:噢。忘了注意到這一點。 – Puppy 2010-11-16 20:16:07

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的!

0

臨時不能綁定到非const引用,只能綁定到常量。 operator<<的過載採用非const引用,因此它不適用於臨時對象。它應該採取FuzzyNumber通過常量參考代替:

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

這另外意味着FuzzyNumberstreamWrite()getA()通過getC()也應宣佈恆定。

0

您的add函數返回一個對將不再存在的本地的引用,導致未定義的行爲。 add函數應該返回值以避免這種情況。