Partage
  • Partager sur Facebook
  • Partager sur Twitter

Petit problème POO

Sujet résolu
    11 juillet 2007 à 23:17:49

    Salut :)

    Je viens de me mettre au C++ (je lis d'ailleurs Le langage C++ de Stroustrup) et j'ai un problème assez étrange avec ce fichier de test d'une classe simple...

    L'erreur renvoyée est "line 6 : no match for operator<< in 'std::cout << ...' :-°

    Voici le code :
    #include "header.h"

    int main(void)
    {
            Coordonnees coord(3, 4);
            cout << coord.GetX() << ";" << coord.GetY() << endl;
            return 0;
    }

    #include "header.h"

    Coordonnees::Coordonnees(int x = 0, int y = 0)
        :this->x(x), this->y(y)
    {
    }

    int Coordonnees::GetX (void) const
    {
        return this->x;
    }
    int Coordonnees::GetY (void) const
    {
        return this->y;
    }

    #include <iostream>
    using namespace std;

    class Coordonnees
    {
        private:
            int x;
            int y;
        public:
            Coordonnees(int x, int y);
            void GetX () const;
            void GetY () const;
    };

     


    J'éspère que vous trouverez l'erreur (j'imagine que c'est encore un truc tout con auquel on pense jamais ^^ )...

    Merci d'avance,
    <Zer0>
    • Partager sur Facebook
    • Partager sur Twitter
      11 juillet 2007 à 23:59:12

      Salut,

      - Je te déconseille d'utiliser les mêmes noms dans le constructeur que les attributs de ta classe, et ça t'évite d'écrire this->x et this->y qui est vraiment une surcharge inutile de ton code. Plus tu compliqueras tes codes, plus ça te rendra fou d'écrire this-> au lieu de simplement rajouter un caractère aux noms des arguments passés au constructeur.

      - Tu aurais du faire attention à la suite du message d'erreur que tu sites. Il te dit qu'il ne sait pas comment t'afficher ce que retourne GetX... c'est à dire void(car lui il regarde le header). Tu dois avoir une autre erreur disant que le prototype de GetX du header est différent de celui du .cpp et de même pour GetY()... Corrige les void en int, et ça devrait aller.
      • Partager sur Facebook
      • Partager sur Twitter
        12 juillet 2007 à 11:26:17

        Encore un truc con, j'avais remarqué l'erreur des void sans changer les prototypes... (d'ailleurs Stroustrup semble utiliser plus facilement "déclaration" que prototype...)

        Néanmoins, cela ne fonctionne pas si je change seulement cela, car il détecte ensuite plein d'erreurs avec les this->.

        Cela fonctionne lorsque je met this->xx, mais je ne pige pas pourquoi il me mettait des erreur avec la première solution... Errors :
        excepted identifier before 'this'
        excepted '(' before 'this'
        excepted '{' before 'this'
        excepted unqualified-id before 'this'
        excepted ',' or ';' before 'this'

        Manifestement, le compilo sort plein d'erreurs possibles puisqu'elles s'annulenet entre elles. La seule chose qui me vient à l'esprit quand je lis ça, c'est qu'on ne peut pas utiliser le pointeur this* dans la ligne d'initialisation du constructeur... est-ce cela ? :o
        • Partager sur Facebook
        • Partager sur Twitter
          12 juillet 2007 à 11:52:33

          Je ne sais pas si on ne peut pas car j'ai jamais essayé.

          Mais de toute façon c'est inutile.
          Coordonnees::Coordonnees(int x = 0, int y = 0)
              :x(x), y(y)


          fonctionne très bien car le compilateur comprend quel x est celui de ta classe et quel x est celui qu'on reçoit en argument du constructeur.
          Pour éviter l'ambiguité (pour le programmeur, puisque le compilateur comprend), on utilise souvent la notation m_x et m_y (i.e. mettre un m_ devant le nom des variables) pour les variables membres afin de voir en lisant le code si cela correspond à une variable ou à un attribut de la classe.

          P.S.: Quand tu montres des erreurs de compilation, merci d'indiquer à quelle ligne se trouve l'erreur.
          • Partager sur Facebook
          • Partager sur Twitter
          Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
            12 juillet 2007 à 13:47:55

            Encore une erreur qu restera un mystère...

            Pour la ligne de code, le compilo ne la montrait pas, mais cela me semble assez explicite...
            • Partager sur Facebook
            • Partager sur Twitter
              12 juillet 2007 à 15:28:46

              Citation : &ltZer0&gt


              #include "header.h"

              Coordonnees::Coordonnees(int x = 0, int y = 0)
                  :this->x(x), this->y(y)
              {
              }

              int Coordonnees::GetX (void) const
              {
                  return this->x;
              }
              int Coordonnees::GetY (void) const
              {
                  return this->y;
              }


              Je suppose qu'ici tu tente de mettre une valeur par défaut a x et a y, le probleme est que tu ne le fais pas au bon endroit.

              Pour donner des valeurs par défaut a des parametre tu dois les mettre a la déclaration et non a l'implémentation.

              CODE.H
              //Code.h
              void UneFonction(int iReponseUniverselle = 42);


              CODE.CPP
              //Code.CPP
              void UneFonction(int iReponseUniverselle)
              {
                    return iReponseUniverselle;
              }


              TEST.CPP
              //TEST.CPP
              //...ici je répond a plein de question existentielle

                    std::cout<<UneFonction()<<std::endl; //affiche 42
                    std::cout<<UneFonction(24)<<std::endl; //affiche 24
              //...ici on sort en beauté
               




              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                15 juillet 2007 à 10:07:11

                "UneFonction" ne devrait pas être de type int?
                Tu la mets en void alors quelle retourne un int :euh:
                • Partager sur Facebook
                • Partager sur Twitter
                  31 juillet 2007 à 16:11:05

                  En effet tu as raison, j'avais oublié de mettre l'argument par défaut dans la déclaration. (réponse tardive :p )

                  Maintenant, j'ai fini de lire Le Langage C++ de Stroustrup, alors je n'ai plus trop de problèmes avec mes codes ^^ je le recommande vivement à ceux qui veulent apprendre le C++ à fond, mais il faut avoir des bases solides avec un autre langage orienté objet (comme Java) ou un langage proche de C++, tel que C, car il ne souhaite pas faire dans la pédagogie et ça se voit. Son livre n'est pas fait pour ça.

                  a+ ;) et merci pour votre aide
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Petit problème POO

                  × 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