Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme objets code::blocks

Sujet résolu
    21 juin 2019 à 16:04:13

    Bonjour, j'ai essayé de faire un programme utilisant des classes pour de la géométrie, en gros, on crée un objet en précisant le type de polygone et des méthodes peuvent calculer le périmètre et l'aire. (D'ailleurs je ne sais pas comment calculer l'aire d'un triangle quelconque avec seulement la mesure de ses cotes). J'ai donc compilé mais j'ai eu un build log du genre référence indéfinie vers « Geometrie::Geometrie(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, double, double, double) ».

    Voici mon code:

    main.cpp

    #include <iostream>
    #include <string>
    #include "Geometrie.h"
    
    using namespace std;
    Geometrie a("rectangle", 2.3, 1.4);
    
    int main()
    {
        cout << "Le perimetre est de : " << a.perimetre() << "cm \n" << "L'aire est de " << a.aire() << "cm2" <<  endl;
        return 0;
    }

    Geometrie.cpp

    #include "Geometrie.h"
    #include <string>
    using namespace std;
    
    
    Geometrie::Geometrie( string a, double b, double c = 0, double d = 0){
    if(a == "carre"){
    m_coteCarre = b
    }
    else if(a == "rectangle"){
    m_longueurR = b;
    m_largeurR = c;
    }
    else if(a == "triangle"){
    m_c1T = b;
    m_c2T = c;
    m_c3T = d;
    }
    else if(a == "cercle"){
    m_rayonC = a;
    }
    }
    
    
    
    
    double Geometrie::perimetre(){
    
    if(a== "carre"){
    return 4 * m_coteCarre;
    }
    
    else if(a == "rectangle"){
    return 2 * m_longueurR + 2 * m_largeurR;
    }
    else if(a == "triangle"){
    return b+c+d;
    }
    
    else if(a == "cercle"){
    return m_rayonC * 2 * 3.14159265;
    }
    }
    
    double Geometrie::aire(){
    if(a== "carre"){
    return m_coteCarre * m_coteCarre;
    }
    else if(a == "rectangle"){
    return m_largeurR * m_longueurR;
    }
    else if(a == "triangle"){
    return 0;
    }
    else if(a == "cercle"){
    return m_rayonC * m_rayonC * 3.14159565;
    }
    }
    
    

    Geometrie.h

    #ifndef GEOMETRIE_H_INCLUDED
    #define GEOMETRIE_H_INCLUDED
    
    #include <string>
    
    class Geometrie {
    public:
    
    double perimetre();
    double aire();
    Geometrie(std::string a, double b, double c = 0, double d = 0);
    
    private:
    double m_coteCarre;
    double m_longueurR;
    double m_largeurR;
    double m_c1T;
    double m_c2T;
    double m_c3T;
    double m_rayonC;
    };
    
    
    
    #endif // GEOMETRIE_H_INCLUDED
    

    Merci de votre aide



    • Partager sur Facebook
    • Partager sur Twitter
      21 juin 2019 à 17:23:25

      Salut

      Il y a pas mal d'erreurs comme par exemple :

      Ligne 8 : manque un point virgule.

      Ligne 20 : m_rayonC à qui tu passes une chaîne de caractères alors que son type est un double.

      Dans ta fonction perimetre(), il ne connaît ni a, ni b, ni c, ni d.

      Pareil dans la fonction aire().

      Etc...

      A ta place je ferais plutôt une classe pour chaque polygone.

      • Partager sur Facebook
      • Partager sur Twitter
        22 juin 2019 à 18:46:55

        Effectivement pour le point virgule ;), pour la ligne 20, je voulais mettre : m_rayonC = b;

        Et en admettant que je fasse une classe pour chaque, je dois faire un fichier .cpp et un .h pour chaque ? Ou est-ce qu'il y a moyen de faire tout sur les memes ?

        J'ai essayé de corriger et j'ai toujours la meme erreur :

        /home/..../Documents/c++/classe-2/main.cpp:10 : référence indéfinie vers « Geometrie::perimetre() »
        /home/..../Documents/c++/classe-2/main.cpp:10 : référence indéfinie vers « Geometrie::aire() »

        En tout cas, merci.

        -
        Edité par LouisBentom 22 juin 2019 à 18:51:15

        • Partager sur Facebook
        • Partager sur Twitter
          22 juin 2019 à 20:50:44

          Et bien en fait tu as certainement oublié de compiler Geometrie.cpp, ça aide pas.

          A part ce qui a déjà été dit, lors de la définition du constructeur Geometrie (dans le .cpp), tu ne dois pas répéter les valeurs par défauts de c et d.

          Sinon oui, crée une classe par forme géométrique, ce sera clairement plus élégant. Profites-en pour les faire hériter d'une classe abstraite Shape qui aura 2 fonctions membres virtuelles pures (perimetre et aire). Techniquement, tu peux mettre tout ça dans le même .h et .cpp si tu veux, ou dans des fichiers différents par classe.

          • Partager sur Facebook
          • Partager sur Twitter
            25 juin 2019 à 12:18:13

            Merci  beaucoup, j'essaierai.

            Code::Blocks n'est pas censé compiler tous les fichiers du projet tout seul ?

            J'ai peut etre mal ajouté les fichiers.

            Je n'en suis pas encore au chapitre de l'heritage, ce sera une excellente idée pour progresser ;)

            • Partager sur Facebook
            • Partager sur Twitter
              25 juin 2019 à 14:31:20

              Salut,

              On espère que tu ne seras jamais au chapitre sur l'héritage du tutoriel d'OC. Je vais copier le message de @Ksass`Peuk.

              Changes de cours. Il apprend un sacré paquet d'âneries à ne pas faire, en plus de montrer des exemples de code buggés et d'être obsolète (quelques recherches sur le forum t'en diront plus). Prends plutôt le tutoriel disponible sur Zeste de Savoir. Ou encore le cours de C++ de @gbdivers, même s'il est encore en écriture il ne contient pas ce genre de bavures (et si tu as des problèmes de compréhension sur une partie et que ce n'est pas à cause d'un manque d'étude du cours, tu peux poster ici). Si tu préfères un cours déjà complet, tourne toi vers le C++ Primer de Lippman dans sa dernière édition (en anglais), il sera un poil moins à jour mais c'est un bon cours.

              • Partager sur Facebook
              • Partager sur Twitter
              Tutoriel Ruby - Bon tutoriel C - Tutoriel SDL 2 - Python avancé - Faîtes un zeste, devenez des zesteurs
                25 juin 2019 à 14:49:44

                Formule de Héron (wikipedia)

                permet le calcul de l'aire connaissant les longueurs des trois côtés a, b et c d'un triangle et donc aussi leur demi-somme p :

                {\displaystyle S={\sqrt {p(p-a)(p-b)(p-c)}}.}

                -
                Edité par michelbillaud 25 juin 2019 à 14:50:17

                • Partager sur Facebook
                • Partager sur Twitter
                  26 juin 2019 à 18:36:20

                  Merci à vous deux, j'irai faire un tour sur les tutoriels et pour la formule, j'avais beau me creuser la tete, je ne trouvais rien ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    26 juin 2019 à 22:08:06

                    Heron d'Alexandrie, c'était pas la moitié d'un con
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Probleme objets code::blocks

                    × 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