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 :

Surcharge operateur << et ostream


Sujet :

C++

  1. #1
    Membre actif
    Inscrit en
    Septembre 2010
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 73
    Par défaut Surcharge operateur << et ostream
    Bonjour,

    Je souhaite faire une classe Logger spéciale. En effet, je voudrais lors de cet appel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Log() << "mot1" << 3 << "mot2";


    Avoir comme chaine de sortie :
    mot1(espace)3(espace)mot2(retour à la ligne)

    Je suppose qu'il faudrait compter le nombre de variable qui passe par "<<" mettre des espaces devant tous, ne pas le mettre au premier, et ajouter la fin de ligne au dernier, mais je ne vois aucune manière de m'y prendre...

    Voici le code (simplifié) de ma classe
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    class Logger
    {
    public:
        Logger { }
        virtual ~Logger(){}
     
        static Logger * _instance;
        static Logger & log(); { return *_instance};
     
        template <class T>
        Logger & operator <<(const T& log);
     
    protected:
        std::ostringstream stream;
     
    private:
        virtual void write(const std::string& message)
        {
        	std::cout << ((message ).c_str());
        }
    };
     
    template <class T> Logger & Logger::operator <<(const T& log)
    {
        stream << log;
        write(stream.str());
     
        stream.str(""); //clear
     
        return log(); 
    }
     
    static Logger& Log() {  return Logger::log();}
    Si quelu'un pouvait me dire si cela est faisable ou pas, merci.

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Citation Envoyé par Awakening Voir le message
    Si quelu'un pouvait me dire si cela est faisable ou pas, merci.
    C'est faisable oui, mais ce ne sera pas trivial.
    Par exemple, comment savoir si tu doit mettre un espace ou une fin de ligne?

  3. #3
    Membre actif
    Inscrit en
    Septembre 2010
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 73
    Par défaut
    Citation Envoyé par r0d Voir le message
    comment savoir si tu doit mettre un espace ou une fin de ligne?
    Justement c'était mon plus gros problème, je ne voyais aucune manière de savoir ça.

    Mais j'ai finalement réussi, d'une manière très sale. Mais ça marche.
    J'explique comment j'y suis parvenu.

    Tout d'abord à ces appelles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Log() << "mot1" << "mot2";
    Log() << "mot3";
    donne:
    log() << mot1, log(), << mot2, log() | log() << mot3, log()

    J'ai trouvé ça bizarre, les deux log() d'affiler, et en fin de compte c'est normal, "log()" une première fois avec l'appelle Log() et 2 fois à cause des << (mot). C'est lorsqu'il va afficher la ligne suivant qu'il va placer le saut de ligne à la fin de la première.

    Comment j'ai "réussi" (c'est vraiment trop moche pour appeler ça une réussite) ?

    J'ai la fonction log(), qui remplace un espace du stream par un saut de ligne OU qui écrit un saut de ligne s'il y en a un dans le stream.
    J'ai la fonction << (mot), qui remplace un saut de ligne par un espace. qui écrit un mot et qui laisse un espace.

    Donc arrivé à la N, un espace va se retrouver en saut de ligne et à N+1 (au premier appel de la ligne suivante) vu qu'il n'y a pas la fonction << (mot) le saut de ligne n'est pas retransformer, j'en profite donc pour l'appliquer.

    Ce que ça donne en code :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    template <class T> Logger& Logger::operator <<(const T& mot)
    {
        if (stream().str() == "\n")
        {
            stream().str(""); stream()<< " "; // Remplace le saut de ligne par un espace
        }
     
        stream() << ToLog; //Ecriture du mot dans le stream
        write(stream().str()); //Ecriture du contenu du stream dans la sortie
     
        stream().str(""); //clear
        stream() << " "; //On laisse un espace
     
        return log();
    }
     
    ILogger& ILogger::log()
    {
        std::cout << "log()";
        //Remplacement de l'espace par un saut
        if (stream().str() == " ")
        {
            stream().str(""); stream().str("\n");
        }
        //Ecriture d'un saut et on vide le stream
        else if (stream().str() == "\n")
        {
            s_instance->write(stream().str());
            stream().str(""); //clear
        }
     
        return *s_instance;
    }
    J'ai du mettre le stream en static aussi...

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Pourquoi ne veux-tu pas faire plus classique?
    Quelque chose du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Log() << "log1" << "log2" << endl;
    Log() << "log3";
    Qui aurait comme sortie:

Discussions similaires

  1. surcharge operateur delete et héritage
    Par Hervé dans le forum C++
    Réponses: 5
    Dernier message: 29/03/2006, 13h59
  2. Surcharge operateur =
    Par rulianf dans le forum C++
    Réponses: 9
    Dernier message: 23/02/2006, 00h32
  3. [debutante] surcharge operateur <<
    Par norkius dans le forum Débuter
    Réponses: 3
    Dernier message: 24/10/2005, 12h20
  4. [Surcharge]Operateur<< avec une classe maison
    Par KeNnEdY dans le forum C++
    Réponses: 6
    Dernier message: 14/09/2005, 15h51
  5. surcharge operateur && pointeurs
    Par le y@m's dans le forum C++
    Réponses: 6
    Dernier message: 10/05/2005, 15h57

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