2009-11-17 8 views
3

J'essaye de créer une fonction qui conjugue un nombre complexe par exemple A (2, 3) deviendra A (2, -3) en tapant ~ A J'ai fait un peu de code ci-dessous mais je suppose que c'est faux, j'espère que vous pouvez m'aider à mettre ça sous pression. J'ai cité la partie que j'ai mal fait dans le code ci-dessous.Fonction de conjugaison pour le nombre complexe

#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

Pas votre question mais je viens de remarquer que votre implémentation de 'operator * (const Complex & c)' est incorrecte. (a + ib) * (c + id) = (ac-bd) + i (ad + bc). –

+0

imaginenary - épellation terrible !!! – Programmer

Répondre

3

essayer

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

Mais il pourrait être plus sage de supprimer les opérateurs de la définition de la classe des fonctions et de créer (ami) à la place. Cela fonctionne mieux avec la conversion de type implicite.

+0

friend Opérateur complexe * (double m, const Complex & c) {return c * m; } ami ostream & operator << (ostream & os, const Complex & c); Y at-il de toute façon pour éviter d'utiliser ami dans ce problème? Parce que j'ai lu cela dans le livre, mais pas tout à fait le comprendre – Toila

+0

Je ne vois pas votre problème ici, mais ayant un constructeur, qui prend un double permet une conversion implicite de double en complexe, l'opérateur * n'étant pas membre, le compilateur peut générer du code pour multiplier un double par un complexe et inversement. membre, vous ne pouvez multiplier complexe avec double, mais pas l'inverse car il n'y a pas de conversions implicite de complexe à doubler et il n'y a pas d'opérateur * qui prend un complexe pour double –

9

Le tilde (~) est un opérateur unaire donc il ne doit pas accepter un paramètre (il fonctionne sur *this). Vous avez également oublié de renvoyer une valeur de operator~.

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

Voir votre code fixe here

BTW: Il est écrit imaginaire.

+0

+1 [:-)] J'allais coller la même chose !!! –

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

Cela devrait fonctionner.

Bien que ce ne soit pas la meilleure idée de renvoyer tout ce que vous avez alloué à l'intérieur de la portée nonglobal, puisque cette région dans la mémoire peut être écrasée à tout moment. Et puis c'est imaginaire, pas imaginenary :)

+1

"Ce n'est pas la meilleure idée de retourner tout ce que vous avez alloué à l'intérieur de la portée nonglobal" - ne s'applique pas ici. Le 'retour' le copie avant qu'il ne soit détruit. En pratique, la variable locale retournée 'conj' est généralement allouée dans l'intervalle de valeur de retour défini par l'appelant, de sorte que la copie n'est même pas nécessaire. – greggo

3

Beaucoup de code, mais si vous auriez comparé votre operator~ à e.g. operator+, vous auriez repéré un détail - il n'y a pas de déclaration de retour.

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

Y a-t-il un moyen d'éviter d'utiliser un ami dans ce problème? parce que j'ai lu cela dans le livre mais je ne comprends pas très bien.

+2

vous ne devriez pas besoin d'amis dans ce cas, puisque vous avez accès complet (lecture) aux membres du complexe.Un ami n'est nécessaire que si vous avez besoin d'accéder aux internals cachés. –

Questions connexes