2009-11-17 65 views
3

我試圖創建一個函數,複合號碼爲 ,例如A(2,3)將變成A(2,-3),通過輸入〜A 我已經完成了一些代碼下面但我想這是錯誤的,我希望你能幫我解決這個問題。 我已經引用了我在下面的代碼中做錯了的部分。複數的共軛函數

#include <iostream> 
    using namespace std; 
    class Complex 
    { 
    private: 
     double real; 
     double imaginenary; 
    public: 
     Complex(); 
     Complex(double r, double i = 0); 

     // Declaration 
     Complex operator~(const Complex & c) const; 


     Complex operator+(const Complex & c) const; 
     Complex operator-(const Complex & c) const; 
     Complex operator*(const Complex & c) const; 
     Complex operator*(double n) const; 
     friend Complex operator*(double m, const Complex & c) 
       { return c * m; }  
     friend ostream & operator<<(ostream & os, const Complex & c); 
    }; 
    Complex::Complex() 
    { 
     real = imaginenary = 0; 
    } 

    Complex::Complex(double r, double i) 
    { 
     real = r; 
     imaginenary = i; 
    } 



    // Definition 
    Complex Complex::operator~(const Complex & c) const 
    { 
     Complex conj; 
     conj.imaginenary = -1 * imaginenary; 
     conj.real = real; 
    } 


    Complex Complex::operator+(const Complex & c) const 
    { 
     Complex sum; 
     sum.imaginenary = imaginenary + c.imaginenary; 
     sum.real = real + c.real; 
     return sum; 
    } 

    Complex Complex::operator-(const Complex & c) const 
    { 
     Complex diff; 
     diff.imaginenary = imaginenary - c.imaginenary; 
     diff.real = real - c.real; 
     return diff; 
    } 
    Complex Complex::operator*(const Complex & c) const 
    { 
     Complex mult; 
     mult.imaginenary = imaginenary * c.imaginenary; 
     mult.real = real * c.real; 
     return mult; 
    } 

    Complex Complex::operator*(double mult) const 
    { 
     Complex result; 
     result.real = real * mult; 
     result.imaginenary = imaginenary * mult; 
     return result; 
    } 
    ostream & operator<<(ostream & os, const Complex & c) 
    { 
     os << "(" << c.real <<"," << c.imaginenary<<"i)"; 
     return os; 
    } 
    int main() 
    { 
     Complex A; 
     Complex B(5, 40); 
     Complex C(2, 55); 
     cout << "A, B, and C:\n"; 
     cout << A <<"; " << B << ": " << C << endl; 
     cout << " complex conjugate is" << ~C << endl; 
     cout << "B + C: " << B+C << endl; 
     cout << "B * C: " << B*C << endl; 
     cout << "10 * B: " << 10*B << endl; 
     cout << "B - C: " << B - C << endl; 
     return 0; 
    } 
+2

不是你的問題,但我只注意到你的'運算符*(const的複雜&C)的執行'是錯誤的。 (a + ib)*(c + id)=(ac-bd)+ i(ad + bc)。 – 2009-11-17 10:17:05

+0

想象 - 可怕的拼寫! – Programmer 2014-03-27 05:13:11

回答

3

嘗試

Complex Complex::operator~() const  
{ 
    Complex conj; 
    conj.imaginenary = -1 * imaginenary; 
    conj.real = real; 
    return conj; 
} 

但它可能是明智的,從類定義中刪除運營商和創建(朋友)函數來代替。它與隱式類型轉換效果更好。

+0

朋友複雜算子*(double m,const Complex&c){return c * m; } friend ostream&operator <<(ostream&os,const Complex & c); 有沒有辦法避免在這個問題中使用朋友?因爲我從書中讀到了這個,但是不太明白 – Toila 2009-11-17 16:37:04

+0

我沒有看到你的問題在這裏,但有一個構造函數,採用一個雙允許從雙到複雜的隱式轉換。隨着運營商*不是一個成員,編譯器可以用於乘雙複雜而另一種方式圓生成代碼。如果運營商*是會員,你只能乘複雜雙,而不是倒過來,因爲有從複雜到雙無implicite converstion而且也沒有運營商*,需要一個複雜的兩倍。 – 2009-11-17 17:11:10

9

的符號(〜)運算符是一元運算符所以它不應該接受一個參數(它的工作原理上*this)。你也忘了從operator~返回一個值。

Complex operator~() const 
{ 
    return Complex(real, -1 * imaginenary); 
} 

請參閱您的固定碼here

BTW:它的拼寫

+0

+1 [:-)]我打算粘貼相同的! – 2009-11-17 09:20:24

1
Complex Complex::operator~(const Complex & c) const 
{ 
    Complex conj; 
    conj.imaginenary = -1 * c.imaginenary; 
    conj.real = c.real; 
    return conj; 
}

這應該做。

儘管這不是回到你非全局範圍內分配什麼好主意,因爲在內存區域可以隨時改寫。順便說一句和它的想象,不是imaginenary :)

+1

「不是最好的想法返回你在非全球範圍內分配的任何東西」 - 這裏不適用。 '返回'在它被銷燬之前複製出來。實際上,返回的局部變量'conj'通常在調用者設置的返回值槽中分配,所以甚至不需要拷貝。 – greggo 2014-12-02 22:45:29

3

大量的代碼,但如果你會比你的operator~到例如operator+,你會發現一個細節 - 沒有返回聲明。

0
friend Complex operator*(double m, const Complex & c) { return c * m; } 
friend ostream & operator<<(ostream & os, const Complex & c); 

反正有沒有在這個問題上使用朋友?因爲我從書中讀到了這些,但是不太明白。

+2

,你不應該需要的朋友在此情況下,既然你有完整(閱讀)訪問複雜的成員。只有當你需要訪問隱藏的內部時才需要朋友。 – 2009-11-17 17:16:00