2009-11-17 3 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

Не ваш вопрос, но я только заметил, что ваша реализация 'operator * (const Complex & c)' неверна. (a + ib) * (c + id) = (ac-bd) + i (ad + bc). –

+0

воображение - страшное написание !!! – Programmer

ответ

3

попробовать

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

Но это может быть мудрее, чтобы удалить операторы из определения класса и создавать (друг) функции вместо. Он работает лучше с неявным преобразованием типа.

+0

friend Сложный оператор * (double m, const Complex & c) {return c * m; } friend ostream & operator << (ostream & os, const Complex & c); Есть ли вообще избежать использования друга в этой проблеме? Потому что я прочитал это из книги, но не совсем понял. – Toila

+0

Я не вижу вашей проблемы здесь, но наличие конструктора, который принимает двойной, допускает неявное преобразование из double в Complex. Если оператор * не является членом, компилятор может генерировать код для умножения двойного на сложный и наоборот. Если оператор * равен член, вы можете только умножать сложный с двойным, но не наоборот, так как нет никакого имплицитного конверсиона из Сложности в double, и нет оператора *, который принимает комплекс для double. –

9

Оператор тильды (~) является унарный оператор, поэтому он не должен принимать параметр (он работает на *this). Вы также забыли вернуть значение от operator~.

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

посещайте фиксированный код here

КСТАТИ: Это пишется воображаемую.

+0

+1 [:-)] Я собирался вставить то же самое !!! –

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

Это должно быть сделано.

Хотя это не лучшая идея, чтобы вернуть все, что вы выделили в области неглобальной области, так как этот регион в памяти может быть перезаписан в любое время. И btw это мнимый, а не воображаемый :)

+1

«Не лучшая идея, чтобы вернуть все, что вы выделили внутри неглобального пространства» - здесь не применимо. «Возвращение» копирует его до его уничтожения. На практике возвращаемая локальная переменная «conj» обычно выделяется в слоте возвращаемого значения, установленном вызывающим, поэтому копия даже не нужна. – greggo

3

Много кода, но если бы вы сравнили ваш operator~, например. operator+, вы бы заметили одну деталь - нет возврата.

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

Есть ли вообще избежать использования друга в этой проблеме? потому что я прочитал это из книги, но не совсем понял.

+2

вам не нужен друг в этом случае, так как у вас есть полный (чтение) доступ к членам комплекса. Друг нужен, только если вам нужен доступ к скрытым внутренним элементам. –

Смежные вопросы