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

SL & STL C++ Discussion :

Implémentation d'une classe dérivant de std::ostream


Sujet :

SL & STL C++

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

    Informations forums :
    Inscription : Février 2007
    Messages : 142
    Points : 89
    Points
    89
    Par défaut Implémentation d'une classe dérivant de std::ostream
    Bonjour à tous,

    J'essaie d'écrire une classe pour effectuer mes logs.
    J'aimerais avoir un découplage fort entre ma classe Logger et les classes émettant les messages devant être loggés. Pour cela, je passe en paramètre à ces classes une référence de std::ostream qui sera en réalité un Logger.
    Voilà en gros l'idée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CommandSender::CommandSender(std::ostream & logger, std::ostream & errorLogger);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Logger logger, errorLogger;
    CommandSender sender(logger, errorLogger);
    Pour rendre ceci possible, il faut que ma classe Logger dérive de std::ostream. Voilà ce que ça donne :
    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
     
    class Logger: public std::ostream
    {
        template<class T>
        friend Logger& operator<<(Logger& out, T val);
     
        public:
            Logger(const std::string& filename);
     
        private:
            /*...*/
    };
     
    template<class T>
    Logger& operator<<(Logger& out, T value)
    {
        /*...*/
        return out;
    }
    Je surcharge l'opérateur <<, qui appelle une méthode effectuant une écriture bufferisée et thread-safe dans un fichier (mais là n'est pas le propos).


    Donc, tout ceci me semblant correct, je teste basiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Logger logger("default.log");
    logger << "test";
    Pouf, aucun problème, ça roule.


    Par contre, si j'essaie d'utiliser un objet logger dans un contexte polymorphe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Logger logger0("default.log");
    std::ostream& logger = logger0;
    logger << "test";
    Patatra ! Erreur de segmentation, plantage, explosion, incendie, 12 morts dont 1 grièvement.


    J'ai essayé quelques petits trucs pour m'en sortir, mais je ne vais pas en dire plus, tout cela fait déjà beaucoup à lire, et je me plante peut-être dés la base.

    Quelqu'un pourrait-il m'aider ?

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 142
    Points : 89
    Points
    89
    Par défaut
    Bon, j'ai changé mes critères de recherche et je suis tombé sur des informations intéressantes.
    Je vais utiliser boost::iostreams, ça m'évitera de réinventer la roue (et puis j'adore boost).

    Merci à ceux qui ont pris le temps de lire mon message !

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/05/2007, 14h15
  2. Réponses: 7
    Dernier message: 01/09/2006, 15h19
  3. Une classe vector sans STD?
    Par dedesite dans le forum C++
    Réponses: 7
    Dernier message: 31/05/2006, 18h04
  4. Réponses: 2
    Dernier message: 05/04/2006, 00h22
  5. Réponses: 12
    Dernier message: 01/07/2004, 12h03

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