Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème de compréhension des classes.

    14 septembre 2018 à 13:03:18

    J'ai crée le projet suivant :

    dans main.cpp :

    dans Rectangle.h:

    et enfin, dans Rectangle.cpp:

    Je ne comprend pas pourquoi j'obtient le message d'erreur suivants : "no matching foction for call to 'Rectangle::calculerSurface()".

    Je suis un peu perdu, dans l'organisation du code, si quelqu'un aurait la volonté de m’expliquer. Le plus problématique c'est que j'ai l'impression de comprendre le cours mais je n'arrive pas à l'appliquer...

    • Partager sur Facebook
    • Partager sur Twitter
      14 septembre 2018 à 13:33:54

      Tu as ce message tout simplement parceque calculerSurface() n'existe pas.
      Dans ta classe tu as déclaré calculerSurface(int largeur, int longueur) et non pas calculerSurface().

      • Partager sur Facebook
      • Partager sur Twitter
        14 septembre 2018 à 13:52:03

        Salut

        Sans parler que ta variable resultat dans ta fonction membre calculerSurface est détruite dés que tu sors des cette fonction.

        Utiliser using namespace std c'est mal, voici  un article qui explique ce que c'est, pourquoi c'est mal et proposes des solutions.

        • Partager sur Facebook
        • Partager sur Twitter
          14 septembre 2018 à 13:55:32

          Salut

          Pour commencer, au lieu d'utiliser des images d'impression écran, tu serais sympa d'utiliser le bouton qui a la forme de </> et d'y copier / coller ton code.

          Cela fournira le code avec une coloration syntaxique tout en permettant aux gens de le copier chez eux en cas de besoin

          Pour répondre à ta question:

          D'abord, si tu indique qu'une fonction nécessite deux valeurs comme paramètre, tu dois veiller à fournir ... les deux valeur qui correspondront aux paramètre à la fonction quand tu l'appelle.

          Ensuite, ta fonction calculerSurface ne va pas faire ce que tu crois, car, lorsque tu déclare une variable résultat dans ta fonction calculerSurface, tu vas temporairement "cacher" la donnée membre resultat de ta classe.

          Du coup, quand tu définira la valeur de resultat dans calculerSurface, tu modifiera ... la variable locale de la fonction et non la donnée membre de la classe.

          De plus, il n'y a aucune raison de fournir la longueur et la largeur dans la fonction calculerSurface, car ce sont des données essentielles de ta classe.  Elles devraient donc être définies directement dans le constructeur de ta classe, ce qui te permettra de n'avoir pas besoin de fournir des paramètres à ta fonction calculerSurface, et donc de te permettre d'appeler cette fonction sans paramètres.

          Par contre, la donnée membre resultat n'a absolument aucune raison d'être car, à partir du moment où tu connait (forcément, vu qu'elle sont définies dans le constructeur) la longueur et la largeur de ton rectangle, tu peux t'en servir directement pour effectuer le calcul de la surface, dont tu ferais d'ailleur bien de renvoyer le résultat.

          Ta classe devrait, au final, ressembler à quelque chose comme

          class Rectangle{
          public:
              Rectangle(int long, int larg);
              int calculerSurface() const;
              int calculerPerimetre() const;
          private:
              int longueur;
              int largeur;
          };

          Note le mot clé const qu suit le nom des fonctions : il indique au compilateur que ces fonctions s'engagent à ne pas modifier l'état courant du rectangle lorsqu'on y fait appel.

          Cela permettra au compilateur de s'assurer que rien n'essayera de modifier le rectangle si on venait à imposer le fait qu'il ne puisse pas être modifié

          Rectangle::Rectangle(int long, int larg):
              longueur{long}, largeur{larg}{
          }
          int Rectangle::calculerSurface() const{
              return longeur * largeur;
          }
          int Rectangle::calculerPerimetre() const{
              reutrn (longueur + largeur) * 2;
          }

          et qui te permettrait de l'utiliser sous une forme proche de

          int main(){
              Rectangle rect{10,15};
              std::cout<<"la surface est de " <<rect.calculerSurface()<<"\n"
                       <<"et le périmetre de "<<rect.calculerPerimetre()<<"\n";
              return 0;
          }
          • Partager sur Facebook
          • Partager sur Twitter
          Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
            14 septembre 2018 à 14:02:22

            Bonjour;

            Ton erreur vient de la fonction main. Il suffit de bien lire le message d'erreur de ton compilateur. Même là, on n'est pas sorti de l'auberge. Ta fonction qui sert à calculer la surface ne fait absolument rien d'utile. Les valeurs ne sont jamais utilisées car la variable locale résultat que tu déclares dans cette même portée agit comme un masque sur la variable membre du même nom. Aussi, il y a ambiguïté entre les paramètres et les variables membres utilisées. Ce n'est pas très propre tout ça. Finalement, pourquoi une fonction qui afficherait le résultat d'une opération sur les variables membres d'un objet devrait prendre un résultat en paramètre alors qu'elle fait partie de cette classe? O.o

            J'en conclus que tu n'as pas compris le principe même de la POO. Ce n'est pas grave, voici ce que j'ai à dire. Si tu suis le cours d'openclassrooms, sache qu'il ne correspond pas à une formation moderne en C++. Il est dénué de toute bonne pratique et ce n'est certainement pas la référence idéale pour bien comprendre les concepts avancés tels qu'ils existent en programmation orientée objet ou encore dans la STL. Il n'y a qu'à regarder ton code. Heureusement grâce à google, tu peux trouver les ressources adéquates pour débuter en C++. Je propose: http://guillaume.belz.free.fr/doku.php?id=programmez_avec_le_langage_c Je te souhaite une bonne continuation :) tout le monde a été débutant.

            -
            Edité par dalyl-zero 14 septembre 2018 à 14:08:09

            • Partager sur Facebook
            • Partager sur Twitter
              14 septembre 2018 à 16:56:57

              Merci à tous pour votre aide ! Je comprend mieux maintenant, effectivement j'étais un peu embrumé.
              • Partager sur Facebook
              • Partager sur Twitter
                15 septembre 2018 à 0:51:34

                Je vais remettre une petite couche sur ce que t'as déjà dit Koala01, il faut penser une classe en termes des services qu'on attend qu'elle rende. La version Koala01 est totalement conçue dans cette optique, on attend logiquement d'une classe rectangle qu'elle soit capable de répondre aux questions quel est ta surface? et quel est ton périmètre? par contre, lui demander d'afficher sa surface et son périmètre sont hors cadre, ça c'est éventuellement le boulot du système d'affichage, qui ira le cas échéant demander au rectangle son périmètre et sa surface en appelant les fonctions membres qui vont bien comme le montre l'exemple de Koala01. Ce point est très important, quand on débute on a tendance à vouloir penser en terme de données et à cause de ça on produit une conception bancale. Il faut toujours s'astreindre à se focaliser sur la notion de service. Quels sont les services qui doivent être rendus par la classe que je crée, c'est cette question et aucune autre à laquelle il faut répondre en premier avant de se lancer dans la création d'une classe. De la réponse à cette question découle tout le reste.
                • Partager sur Facebook
                • Partager sur Twitter
                Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug

                Problème de compréhension des classes.

                × 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