Partage
  • Partager sur Facebook
  • Partager sur Twitter

implementer l'operateurs <<

Sujet résolu
    1 janvier 2021 à 3:59:52

    Salut je suit le cours de C++ de Openclassroom, je suis au chapitre 16 (Surchargez un opérateur). Le problème que je rencontre avec mon code est le suivant:

    Mon projet est en 3 fichier pour creer la classe Character(le main.cpp, Charactere.h et Charatere.cpp), je cherche a implémenter l'operateur << (avec cout) pour afficher tous les attributs de n'importes quels objets venant de la classe Charactere (chaque objet de cette classe a 3 attributs: un nom, un métier et un âge) pour les afficher dans la console.

    Mais mon EPI indique que la fonction operator<<() ne marche pas. Normalement il y a que une (ou plusieurs ce que je redoute) erreur(s) dans mon code en particulier sur l'implémentation de l'operateur<<() (je pense a un std:: manquant ou un truc comme ça), il appelle une méthode dans la classe Character pour accéder au attributs. Les autres méthodes marchaient très bien avant l'arriver de l'opérateur mais au cas ou je vous met les 3 fichiers.

    j'ai tout essayé rajouter des std:: ou je pensait qu'il en manquer et pleins d'autres choses différentes mais le problème et toujours présent. Help me!!


    le fichier principal main.cpp

    #include <iostream>
    #include <string>
    
    #include "Charactere.h"
    
    using namespace std;
    
    int main() {
    	
    	Charactere tom; 													//je declare l'objet " tom"
    	
    	cout << tom.getJob() << endl;										//grâce à la méthode .getJob() j'ai sonmétier
    	
    	tom.changeJob("policier");											//grâce à la méthode .changeJob() je change son métier
    	
    	cout << tom.getJob() << " " << tom.getName() << endl;				//grâce à la méthode .getName() j'ai sonnom
    	
    	tom.getYearsOld();													//grâce à la méthode .getYearsOld() j'ai son age
    	
    	tom.addYearsOld(5);													//grâce à la méthode .addYeatsOld() je lui fair prendre de l'age
    	
    	cout << tom;														//cette ligne devrait renvoyé tous les attributs d'un objet Charactere
    		
    	return 0;
    }



    le header pour la classe Charactere.h


    #ifndef CHARACTERE_H
    #define CHARACTERE_H
    
    #include <iostream>
    #include <string>
    
    
    //implementation de l'opérateur <<
    ostream &operator<<(ostream &flux, Charactere const& charactereFlux){
        charactereFlux.showFlux(flux);
        return flux;
    }
    
    
    //la classe pour les objets Charactere
    class Charactere{
    	public:
    		
    		//constructor
    		Charactere();
    		
    		//get the name of Charactere
    		std::string getName() const;
    		
    		//change or get the job of charactere
    		void changeJob(std::string &newJob);
    		std::string getJob() const;
    		
    		//add or get the years of charactere
    		void addYearsOld(int addX = 1);
    		int getYearsOld();
    		
    		//prothotype de la méthode void pour "cout" les attributs
    		void showFlux(std::ostream &flux)const;
    		
    		
    	private:
    		
    		//les attributs
    		std::string m_name;
    		std::string m_job;
    		int m_yearsOld;
    		
    	
    };
    
    #endif



    et le Charactere.cpp

    #include "Charactere.h"
    
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    //les méthodes qui marcheent
    
    //retourne le nom
    string Charactere::getName() const{
    	return m_name;
    }
    
    
    
    //change le job
    void Charactere::changeJob(string &newJob){
    	m_job = newJob;
    }
    
    //retourne le job
    string Charactere::getJob() const{
    	return m_job;
    }
    
    
    
    //le fait grandir
    void Charactere::addYearsOld(int addX){
    	m_yearsOld += addX;
    }
    
    //retourne son age
    int Charactere::getYearsOld(){
    	cout << m_yearsOld;
    }
    
    
    
    //constructeur par default
    Charactere::Charactere(): m_name("Tom"), m_job("Sans emploie"), m_yearsOld(18){
    	
    }
    
    
    //methode pour retourner tous les attribus de l'objet Charactère
    void Charactere::showFlux(ostream &flux)const{
    	flux << m_name << " " << m_job << " " << m_yearsOld;
    }




    • Partager sur Facebook
    • Partager sur Twitter
      1 janvier 2021 à 9:16:29

      Et où est ta fonction  operator<<  qui ne marche pas?

      EDIT: oups, pas mes lunettes.

      -
      Edité par michelbillaud 1 janvier 2021 à 11:47:54

      • Partager sur Facebook
      • Partager sur Twitter
        1 janvier 2021 à 11:43:35

        Tu peux aussi changer de cours et oublier tout ce que tu y as appris car il est totalement obsolète en plus d'apprendre des tas de conneries.
        • Partager sur Facebook
        • Partager sur Twitter

        git is great because Linus did it, mercurial is better because he didn't.

          1 janvier 2021 à 12:09:11

          Simplifions le problème : une classe avec un seul champ.

          #include <iostream>
          
          class Personnage {
              private:
                  std::string m_nom;
              public:
                  Personnage(const std::string & nom);
                  std::string to_string() const;
          };
          
          Personnage::Personnage(const std::string & nom) 
              : m_nom{nom}
              {}
          
          std::string Personnage::to_string() const 
          {
              return "Le personnage " + m_nom;
          }
          
          std::ostream & operator<<(std::ostream & s, const Personnage &p) {
              return  s << p.to_string();
          }
          
          int main() {
              Personnage p("tom");
              std::cout << p << std::endl;
          
          }


          Préférence personnelle : définir une fonction membre to_string, chargée de fabriquer une chaîne décrivant la donnée.

          • C'est homogène avec la fonction du même nom dans la bibliothèque standard
          • C'est plus général que l'écriture sur un flux de sortie (et si on veut stocker la description d'un objet dans une base de données ?)
          On peut aussi préférer écrire
          std::cout << p.to_string() << std::endl;

           en se passant de surcharge de operator<<, machin d'une utilité tout à fait contestable.

          -
          Edité par michelbillaud 1 janvier 2021 à 12:14:30

          • Partager sur Facebook
          • Partager sur Twitter
            1 janvier 2021 à 16:50:29

            Merci @michelbillaud mon code fonction parfaitement maintenant.
            • Partager sur Facebook
            • Partager sur Twitter
              18 février 2021 à 14:26:44 - Message modéré pour le motif suivant : Message complètement hors sujet


              implementer l'operateurs <<

              × 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