2017-02-25 50 views
-1

所以我被要求重載運算符來實現複數的基本算術運算。我已經得到了+, - 和=的工作,但即使我認爲我有正確的邏輯,但我似乎無法得到*工作。複數重載*運算符(C++)

我的代碼有什麼問題?

#ifndef COMPLEX_HPP 
#define COMPLEX_HPP 
#include <string> 

class Complex 
{ 
    public: 
     Complex(double = 0.0, double = 0.0); // default constructor 
     Complex add(const Complex&) const;   // function add 
     Complex subtract(const Complex&) const; // function subtract 
     Complex multiply(const Complex&) const; // function multiply 
     std::string toString() const; // return string representation 
     void setComplexNumber(double, double); // set complex number 

     void operator=(const Complex& obj) 
     { 
      (*this).realPart = obj.realPart; 
      (*this).imaginaryPart = obj.imaginaryPart; 
     } 

     Complex operator+(const Complex& obj) 
     { 
      Complex tmp_obj = *this; 
      tmp_obj.realPart = tmp_obj.realPart + obj.realPart; 
      tmp_obj.imaginaryPart = tmp_obj.imaginaryPart + obj.imaginaryPart; 
      return tmp_obj; 
     } 

     Complex operator-(const Complex& obj) 
     { 
      Complex tmp_obj = *this; 
      tmp_obj.realPart = tmp_obj.realPart - obj.realPart; 
      tmp_obj.imaginaryPart = tmp_obj.imaginaryPart - obj.imaginaryPart; 
      return tmp_obj; 
     } 

     Complex operator*(const Complex&obj) 
     { 
      Complex tmpObj = *this; 
      tmpObj.realPart = (tmpObj.realPart * obj.realPart) - (tmpObj.imaginaryPart * obj.imaginaryPart); 
      tmpObj.imaginaryPart = (tmpObj.realPart * obj.imaginaryPart) + (tmpObj.imaginaryPart * obj.realPart); 
      return tmpObj; 

     } 


    private: 
     double realPart; 
     double imaginaryPart; 
}; 
+0

通常,採用兩個參數的運算符應該作爲免費的非成員函數來實現。這允許LHS操作數的隱式轉換。 –

+0

我以爲C++有std :: complex年齡,爲什麼要實現自己的,是一個教育的事情嗎?希望稍後進行定製的內在數學優化? – Swift

回答

1

一旦你開始覆蓋tmpObj(具體tmpObj.realPart),你已經失去了原有的價值。所以,不要從tmpObj讀取,而是從*this

tmpObj.realPart = realPart * obj.realPart - imaginaryPart * obj.imaginaryPart; 
//    ^^^^^^^^     ^^^^^^^^^^^^^ 
tmpObj.imaginaryPart = realPart * obj.imaginaryPart + imaginaryPart * obj.realPart; 
//      ^^^^^^^^      ^^^^^^^^^^^^^ 
1

你實現operator*()的本質。

Complex operator*(const Complex&obj) 
{ 
    Complex tmpObj = *this; 
    tmpObj.realPart = (tmpObj.realPart * obj.realPart) - tmpObj.imaginaryPart * obj.imaginaryPart); 
    tmpObj.imaginaryPart = (tmpObj.realPart * obj.imaginaryPart) + (tmpObj.imaginaryPart * obj.realPart); 
    return tmpObj; 
} 

的問題是,在第一語句修改tmpObj.realPart,和第二語句進行彷彿tmpObj.realPart沒有被修改。

修復很簡單:不要在作業的右側使用tmpObj

Complex operator*(const Complex&obj) 
{ 
    Complex tmpObj; // your default constructor initialises to (0.0,0.0) 
    tmpObj.realPart = (realPart * obj.realPart) - (imaginaryPart * obj.imaginaryPart); 
    tmpObj.imaginaryPart = (realPart * obj.imaginaryPart) + (imaginaryPart * obj.realPart); 
    return tmpObj; 
}