Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Probléme] Code::Block C++

Sujet résolu
    19 septembre 2017 à 22:19:56

    Bonjour, alors voici mon problème je ne comprend pas pourquoi j'ai cette erreur j'ai beau chercher je ne vois pas :

    ||=== Build: Debug in TPZFraction (compiler: GNU GCC Compiler) ===|

    Y:\code\TP ZFraction\TPZFraction\ZFraction.h|11|error: 'std::ostream' has not been declared|

    Y:\code\TP ZFraction\TPZFraction\ZFraction.cpp|20|error: prototype for 'void ZFraction::affiche(std::ostream&) const' does not match any in class 'ZFraction'|

    Y:\code\TP ZFraction\TPZFraction\ZFraction.h|11|error: candidate is: void ZFraction::affiche(int&) const|

    ||=== Build failed: 3 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

    voici mon code :

    main.cpp :

    #include <iostream>
    #include "ZFraction.h"
    
    using namespace std;
    
    ostream& operator<<(ostream& flux, ZFraction const& fraction)
    {
        fraction.affiche(flux);
        return flux;
    }
    
    int main()
    {
    
        ZFraction a(9,10);
    
        return 0;
    }



    ZFraction.h :

    #ifndef ZFRACTION_H_INCLUDED
    #define ZFRACTION_H_INCLUDED
    
    class ZFraction
    {
        public:
    
        ZFraction();
        ZFraction(int numerateur, int denominateur);
        ZFraction(int numerateur);
        void affiche(std::ostream& flux) const;
    
    
        private:
    
        int m_numerateur;
        int m_denominateur;
    };
    
    #endif // ZFRACTION_H_INCLUDED

    ZFraction.cpp :

    #include "ZFraction.h"
    #include <iostream>
    
    
    ZFraction::ZFraction() : m_numerateur(0), m_denominateur(1)
    {
    
    }
    
    ZFraction::ZFraction(int numerateur, int denominateur) : m_numerateur(numerateur), m_denominateur(denominateur)
    {
    
    }
    
    ZFraction::ZFraction(int numerateur) : m_numerateur(numerateur), m_denominateur(1)
    {
    
    }
    
    void ZFraction::affiche(std::ostream& flux) const
    {
        if(m_denominateur > 1)
        {
            flux << m_numerateur << "/" << m_denominateur;
        }
        else
        {
            flux << m_numerateur;
        }
    }

    Voilà, merci de me repondre et bonne journée/soirée

    Cordialement, Mathis Lechopier.

    • Partager sur Facebook
    • Partager sur Twitter
      19 septembre 2017 à 23:17:55

      Bonsoir.

      Ligne 1 : tu inclues ZFraction.h avant d'inclure <iostream> , ce qui fait qu' a la compilation de ZFraction.cpp, le compilateur analyse ZFraction.h alors qu'il ne connait pas encore <iostream>

      • Partager sur Facebook
      • Partager sur Twitter

      Mon site web de jeux SDL2 entre autres : https://www.ant01.fr

        20 septembre 2017 à 13:09:58

        Merci Beaucoup pendant 1 secondes je me suis dis ça aussi mais j'ai zapper aprés. En tous cas merci beaucoup !

        Cordialement Mathis Lechopier.

        • Partager sur Facebook
        • Partager sur Twitter
          20 septembre 2017 à 14:58:06

          Salut,

          Par principe, quand on écrit un fichier d'en-tête (comme ZFraction.h), on doit veiller à ce que l'ordre dans lequel on va inclure les différents fichiers n'aie aucune importance.

          Dans le cas présent, c'est râpé, car, si tu inclus ZFraction.h avant iostream, le compilateur se plaindra de ne pas trouver le type std::ostream.

          Il faudrait donc inclure le fichier <iostream> directement dans ZFraction.h.

          Pas de bol le jeu des inclusions en cascade aidant (le fait que le contenu d'un fichier inclus dans un fichier d'en-tête soit copié, et ce de manière récursive) fait que cette seule inclusion correspond au fait de rajouter plus de 25 000 lignes (25 429, au dernier décompte sur ma machine, dans ma configuration particulière) dans n'importe quel fichier d'implémentation (les fichiers dont l'extension est .cpp) qui inclut ce fichier.

          Or, ces 25 000 lignes devront être traitées par le compilateur, et ca prend un temps bête.

          Par chance, ZFraction.h doit uniquement savoir que le type std::ostream (en fait, le type std::basic_ostream<char> pour être précis) existe.  Lui n'a absolument aucun besoin d'accéder au contenu de ce type, ni de disposer de l'implémentation des fonctions que l'on retrouve dans iostream et dans d'autres fichiers (il n'y a que les fichiers d'implémentation ZFraction.cpp et main.cpp qui doive y accéder).

          C'est la raison pour laquelle les développeur de la bibliothèque standard ont, dans leur très grande sagesse créé le fichier d'en-tête standard <iosfwd> qui permet au compilateur de savoir que tous les types que l'on retrouve dans <iostream> (et d'autres, comme <fstream>) existent et qui ne rajoute "que" 1570 lignes de code à peu près.  Ce qui est quand même près de 20 fois moins que iostream, et qui est encore beaucoup moins si on décide d'inclure des fichiers comme <fstream> ou <sstream>.

          Si bien que, en théorie, l'idéal serait:

          • d'inclure le fichier <iosfwd> dans le fichier d'en-tête (ZFraction.h)
          • d'inclure le fichier <iostream> dans le fichier d'implémentation qui en ont besoin, à savoir ZFraction.cpp (à cause de l'implémentation de la fonction membre ZFraction::affiche).

          Et tant que l'on n'écrira pas un code proche de

          int main(){
              ZFraction a(9,10);
              /* c'est cette ligne ci qui poserait problème */
              std::cout<<a;
          }

          le fichier main.cpp n'aura même pas besoin de l'inclure non plus ;)

          Au passage: le cours sur ce site est obsolète et apprend un tas de conneries qui ont été débattues en long, en large et en travers sur le forum.  Je te laisses le soin de faire une recherche pour savoir ce que j'entends par là, mais je te conseille vivement d'abandonner ce cours ;)

          -
          Edité par koala01 20 septembre 2017 à 14:59:08

          • 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
            20 septembre 2017 à 17:38:05

            [ Message de Koala01  [...] ]

            Et tant qu' à faire l'aiguiller sur un bon cours comme celui de gbdivers : http://guillaume.belz.free.fr/doku.php?id=start#cours_de_c_moderne ou bien le C++ Primer de Lippman en 5ème édition si l' OP veut une référence papier.

            • Partager sur Facebook
            • Partager sur Twitter

            Mon site web de jeux SDL2 entre autres : https://www.ant01.fr

              20 septembre 2017 à 21:09:14

              merci pour vos conseil, cependant, malgré les quelques mauvaises habitudes que j'aurais pus prendre ne lisant se cours, je suppose que je n'aurais pas non plus besoin de tout réapprendre, mais juste de comprendre ces quelles sont ces mauvaises habitudes et m'en débarrassée ? Ce n'est pas comme si j'avais appris quelque chose de totalement faux non plus n'est ce pas ?

              Cordialement Lechopier Mathis.

              • Partager sur Facebook
              • Partager sur Twitter
                20 septembre 2017 à 21:42:43

                Quelques exemples de mauvaises paratiques que le cours d' OpenClassrooms peut donner:

                - utilisation de tableau style C à la place de std::array<type, size>

                - utilisation de fonction de génération d'aléatoire srand() au lieu des foncionnalités de l'header <random> du C++

                - utilisation de 'new' alors que dans 98 % des cas on utilisera les conteneurs du C++ std::vector ; std::unique_ptr et j'en passe

                - La programmation orientée objet avec l' implémentation d'un constructeur de copie pour un objet qui a sémantique d'entité

                - Utilisation de pointeurs nus à la place des pointeurs intelligents.

                Et d'autres

                -
                Edité par Warren79 20 septembre 2017 à 21:44:20

                • Partager sur Facebook
                • Partager sur Twitter

                Mon site web de jeux SDL2 entre autres : https://www.ant01.fr

                  21 septembre 2017 à 20:12:52

                  trés bien merci donc je suppose qu'il vaut mieux que je commence directement le cour que vous m'avez envoyez et que je relise les partie que j'ai déjà vu, sans avoir a forcement tout réapprendre. En tous cas merci de votre réponse.

                  Cordialement Lechopier Mathis.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    26 septembre 2017 à 18:30:01

                    Oui , je te conseille de lire le cours de gbdivers depuis le début, comme si tu apprenais le C++ pour la première fois. Le cours d'OC est vraiment très mauvais pour quiconque veuille apprendre le C++ 'moderne'
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Mon site web de jeux SDL2 entre autres : https://www.ant01.fr

                    [Probléme] Code::Block C++

                    × 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