Partage
  • Partager sur Facebook
  • Partager sur Twitter

surcharge d'oppérateur

Sujet résolu
    11 octobre 2007 à 15:05:15

    bonjour a tous ^^

    un petit soucis qui me taquine depuis quelques jours maintenant sur la surcharge d'oppérateur, et plus particulièrement avec cout.

    en effet on a vu comment afficher un objet de type date avec cout dans le cours de matéo; par contre l'affichage de la somme de deux dates genere une erreur de compilation -_-'

    j'ai bien tenté de créer d'autre surcharge; mais sans succès ...

    mon programme est fait pour traiter des complexes (addition multiplication soustraction division) et je voudrait donc pouvoir faire
    1. cout << complexe1 + complexe2;

    mais voila sa ne marche pas ...

    je post mon code ici :

    complexe.h (definition de la classe)
    1. #include <iostream>
    2. #include "nombre.h"
    3. #include <math.h>
    4. class complexe : public nombre
    5. {
    6.     private :
    7.     double m_a;
    8.     double m_b;
    9.     public :
    10.     void afficher(std::ostream &out);
    11.     double module();
    12.     double arg();
    13.     complexe conj();
    14.     double Re();
    15.     double Im();
    16.     complexe();
    17.     complexe(double a, double b);
    18.     complexe operator+(const complexe &c2);
    19.     complexe operator-(const complexe &c2);
    20.     complexe operator*(const complexe &c2);
    21.     complexe operator/(const complexe &c2);
    22. };
    23. std::ostream &operator<<(std::ostream &out, complexe &c1 );


    complexe.cpp
    1. #include "complexes.h"
    2. using namespace std;
    3. ostream &operator<<(ostream &out, complexe &c1 )
    4. {
    5.     c1.afficher(out);
    6.     return out;
    7. }
    8. void complexe::afficher(ostream &out)
    9. {
    10.     if (m_a!=0)
    11.     {
    12.         out << m_a;
    13.         if (m_b>0)
    14.             out << "+";
    15.     }
    16.     if (m_b!=0)
    17.         out << m_b << "i";
    18.     if (m_a == 0 && m_b == 0)
    19.         out << 0;
    20. }
    21. complexe complexe::operator+(const complexe &c2)
    22. {
    23.     complexe resultat(m_a+c2.m_a, m_b+c2.m_b);
    24.     return resultat;
    25. }
    26. complexe complexe::operator-(const complexe &c2)
    27. {
    28.     complexe resultat(m_a-c2.m_a, m_b-c2.m_b);
    29.     return resultat;
    30. }
    31. complexe complexe::operator*(const complexe &c2)
    32. {
    33.     complexe resultat(m_a*c2.m_a - m_b*c2.m_b, m_a*c2.m_b + m_b*c2.m_a);
    34.     return resultat;
    35. }
    36. complexe complexe::operator/(const complexe &c2)
    37. {
    38.     complexe temp(c2.m_a, -c2.m_b);
    39.     double module = sqrt(c2.m_a*c2.m_a + c2.m_b*c2.m_b);
    40.     if (module==0)
    41.         return c2;
    42.     complexe resultat((m_a*temp.m_a - m_b*temp.m_b)/module, (m_a*temp.m_b + m_b*temp.m_a)/module);
    43.     return resultat;
    44. }
    45. complexe complexe::conj()
    46. {
    47.     complexe resultat(m_a,-m_b);
    48.     return resultat;
    49. }
    50. double complexe::Re()
    51. {
    52.     return m_a;
    53. }
    54. double complexe::Im()
    55. {
    56.     return m_b;
    57. }
    58. complexe::complexe()
    59. {
    60.     m_a = 0;
    61.     m_b = 0;
    62. }
    63. complexe::complexe(double a, double b)
    64. {
    65.     m_a = a;
    66.     m_b = b;
    67. }


    et le main :
    1. #include <iostream>
    2. #include "complexes.h"
    3. using namespace std;
    4. int main()
    5. {
    6.     complexe c1(2.0,3.0);
    7.     complexe c2(0,3.0);
    8.     complexe c = c1 / c2;
    9.     cout << "(" << c1 << ") / (" << c2 << ") = " << c << endl;
    10.     complexe c3 = c1.conj();
    11.     cout << c3 <<endl;
    12.     cout << c3*c1 << endl; //erreur : no match for 'operator<<' in 'std::cout<< ($c3)->complexe::operator*((etc...)
    13.     cout << c3+c1 << endl; //erreur : idem avec +
    14.         return 0;
    15. }


    juste : nombre est une classe virtuelle pure pour pouvoir traiter les nombres indifféremment de leur type, elle est actuellement vide ...

    si quelque peux m'aider sa serai simpas j'ai meme planté mon prof d'info sur le coup -_-'
    merci en tout cas =)
    • Partager sur Facebook
    • Partager sur Twitter
      11 octobre 2007 à 16:58:50

      Essaie en mettant tes opérations entre parenthèses car là avec ce ci il va peut être essayer de multiplier "cout << c3" et "c1"
      • Partager sur Facebook
      • Partager sur Twitter
        11 octobre 2007 à 20:55:02

        Comme dirait lmghs, tes signatures ne sont pas correctes et l'erreur vient de là (de + et * et pas de cout)

        Ne jamais oublier les passages par référence constante !!

        P.S.: Il existe déjà une classe <complex> dans la STL, bien qu'elle ne soit pas super bien codée à mon avis, elle sera mieux si tu penses utiliser des complexes ailleurs. Sinon, ben c'est un excellent exercice.

        • Partager sur Facebook
        • Partager sur Twitter
        Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
          11 octobre 2007 à 21:36:32

          Pas "const-correctes" je dirais plutôt -- et pas canoniques non plus, mais c'est une autre histoire (symétrie, tout ça).
          Pour l'instant, cela ne va pas se voir avant un c1+c2+c3+c4+...+cn.

          Mais c'est le fait que l'opérateur d'injection ne prenne pas une référence constante que tu observes ce que tu observes.
          Chose qui t'obligera ensuite à déclarer const, comme il se doit, tes accesseurs -- la fonction afficher() ne servant à rien d'utile -- et on en revient en effet à un problème de const-correction.

          J'en avais parlé dans ma critique du tuto, mais suite à un changement de forum, les liens sont cassés.

          NB: m@téo, si tu me lis, ceci est la raison pour laquelle la const-correction est vachement importante en C++. C'est le coup à ne pas pouvoir afficher les résultats d'expressions sans passer par des temporaires nommés.
          • Partager sur Facebook
          • Partager sur Twitter
          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
            12 octobre 2007 à 9:46:35

            j'avoue ne pas avoir compris ta reponse, si tu pouvais etre un peu plus explicite ...
            opérateur d'injection, post correction, c'est des termes assé technique (entre autre) que je doit traduire en code, ce qui n'est pas évident quand on ne vois pas a quoi cela correspond =)
            • Partager sur Facebook
            • Partager sur Twitter
              12 octobre 2007 à 9:55:06

              "const", pas "post". En gros il manque tous les const qui pourraient être mis. Cf le dernier tuto de m@téo pour avoir un début de réponse -- je manque de temps pour l'instant.

              Et l'opérateur d'injection, est celui qui permet d'injecter des objects dans les flux -> operator<<() qui doit devenir:
              std::ostream& operator<<(std::ostream &os, TonType const& valeur)
              • Partager sur Facebook
              • Partager sur Twitter
              C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                13 octobre 2007 à 1:47:50

                j'ai fini par trouver la solution a ce problème (il s'agit effectivement de problèmes de const et cie)
                et c'est vrai qu'il est plus logique après coup de déclarer les opérateurs numériques comme const ^^

                je garde la méthode afficher je trouve que le code est plus clair, je la met juste en const :p

                enfin je vais tenter de respecter un peu plus la sémantique des const sa m'évitera d'autres erreurs par la suite (et c'est toujours mieux d'avoir du code propre non ? ^^ )


                je reviendrait certainement a la charge sur le sujet des complexe (ou un autre corps sa depend de l'humeur) alors a bientot et merci
                • Partager sur Facebook
                • Partager sur Twitter

                surcharge d'oppérateur

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown