IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Surdefinition de l'operateur "<<" avec une classe


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut Surdefinition de l'operateur "<<" avec une classe
    Bonjour a tous,

    Je n'arrive pas a redefinir l'operateur "<<" avec ma classe. Voici ce que j'ai reussi a faire compiler en tatonnant :

    IntervalleErreur.cxx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    string operator << (const string toto, const IntervalleErreur &IE)
    {
    	switch (IE.type_ie)
    	{
    		case 0:
    			return toto+" DefinitionErreur";
    			break;
    		case 1:
    			return toto+" EmptyErreur";
    			break;
    		case 2:
    			return toto+" DivisionParZeroErreur";
    			break;
    	}
    }
    IntervalleErreur.hxx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <string>
     
    using namespace std;
     
    #ifndef INTERVALLEERREUR
    #define INTERVALLEERREUR
    enum ErreurType {DefinitionErreur, EmptyErreur, DivisionParZeroErreur};
     
    class IntervalleErreur
    {
    	private:
    	ErreurType type_ie;
     
    	public:
    	friend string operator << (const string, const IntervalleErreur&);
     
    	IntervalleErreur(ErreurType);
    	void AfficheIE(void);
    };
    #endif
    J'ai reussi dans une autre classe a surdefinir des operateurs "+", "-", "*"...etc. a peu pres de la meme maniere, mais ca n'a pas l'air de fonctionner de la meme maniere avec cet operateur la.

    Le but est que quand je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    IntervalleErreur ie(EmptyErreur);
    cout<<"Type de l'erreur "<<ie<<endl;
    j'obtienne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Type de l'erreur EmptyErreur
    Quelqu'un peut me depanner ?
    Merci d'avance

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    std::cout n'est pas une chaîne de caractère mais un flux. Donc tu devrais t'appuyer sur cette entrée de la F.A.Q. : Comment utiliser les flux pour afficher ou saisir mes objets ?

    Si ensuite tu as besoin de sérialiser ton objet vers une chaîne de caractère std::string, alors il faut t'appuyer sur un flux lié à une chaîne de caractère, stringstream, comme l'explique cette autre entrée de la F.A.Q. Comment convertir n'importe quel type d'objets en string ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    348
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 348
    Points : 103
    Points
    103
    Par défaut
    Merci beaucoup pour ton aide, voici la correction qu'il faut appliquer a mon code:

    IntervalleErreur.hxx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #include <string>
    #include <ostream>
    #include <iostream>
    
    using namespace std;
    
    #ifndef INTERVALLEERREUR
    #define INTERVALLEERREUR
    enum ErreurType {DefinitionErreur, EmptyErreur, DivisionParZeroErreur};
    
    class IntervalleErreur
    {
    	private:
    	ErreurType type_ie;
    
    	public:
    	friend ostream& operator << (ostream&, const IntervalleErreur&);
    
    	IntervalleErreur(ErreurType);
    	void AfficheIE(void);
    };
    #endif
    IntervalleErreur.cxx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    ostream& operator << (ostream &toto, const IntervalleErreur &IE)
    {
    	switch (IE.type_ie)
    	{
    		case 0:
    			toto<<" DefinitionErreur";
    			return toto;
    			break;
    		case 1:
    			toto<<" EmptyErreur";
    			return toto;
    			break;
    		case 2:
    			toto<<" DivisionParZeroErreur";
    			return toto;
    			break;
    	}
    }
    Sans oublier dans ce dernier d'includer IntervalleErreur.hxx qui lui-meme include <iostream> et <ostream> (double emploi ?).

    En esperant que ca aide d'autres personnes. ^^
    Merci encore !

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    C'est fortement recommandé de ne pas le faire dans un fichier d'en-tête. Ca réduit grandement l'intérêt des espaces de nom. cf F.A.Q. : Quand utiliser / ne pas utiliser using namespace ?

    Etant donné que tu ne fais que référencer les flux dans ton fichier d'en-tête, tu peux te contenter d'inclure <iosfwd> dans le .h et <ostream> dans le .cpp. Le <string> ne sert à rien par rapport au code que tu présentes.

    Pourquoi dans le switch/case utiliser des valeurs numériques (0, 1 et 2) et pas les valeurs de l'énum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    	switch (IE.type_ie)
    	{
    		case DefinitionErreur:
    			toto<<" DefinitionErreur";
    			return toto;
    			break;
    		case EmptyErreur:
    			toto<<" EmptyErreur";
    			return toto;
    			break;
    		case DivisionParZeroErreur:
    			toto<<" DivisionParZeroErreur";
    			return toto;
    			break;
    	}
    }
    Ton switch ne gère pas de défault, et la fonction a une sortie possible sans return. Cela va probablement avoir quelques effets surprises en phase de debuggage. Tu pourrais lever une exception dans ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #include <stdexcept>
     
    std::ostream& operator << (std::ostream &toto, const IntervalleErreur &IE)
    {
    	switch (IE.type_ie)
    	{
    		case DefinitionErreur:
    			toto<<" DefinitionErreur";
    			return toto;
    			break;
    		case EmptyErreur:
    			toto<<" EmptyErreur";
    			return toto;
    			break;
    		case DivisionParZeroErreur:
    			toto<<" DivisionParZeroErreur";
    			return toto;
    			break;
    	}
     
    	throw std::domain_error("IntervalleErreur.type_ie invalid");
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. quote dans des valeurs d'une colonne SET
    Par Jean Fi dans le forum Requêtes
    Réponses: 6
    Dernier message: 30/03/2006, 20h16
  2. [Surcharge]Operateur<< avec une classe maison
    Par KeNnEdY dans le forum C++
    Réponses: 6
    Dernier message: 14/09/2005, 15h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo