2017-05-07 4 views
2

Je veux écrire un programme et permettre à l'utilisateur d'avoir le contrôle sur la journalisation du paquet en réglant le programme pour afficher la progression ou le désactiver.C++ Logging utilisant std :: ostream et std :: cout

Je sais que std::cout est un std::ostream avec la différence que std::cout redirige les résultats vers la sortie standard.

Je souhaite que ma classe ait un membre std::ostream dans lequel je me connecte. Ensuite, si l'utilisateur active l'affichage, ce membre sera attaché à std::cout et affichera les résultats, sinon il ne le fera pas.

Ce que j'ai à l'esprit est quelque chose de semblable à ceci:

class log { 
private: 
    std::ostream display; 
public: 
    void func(); 
    void show_display(); 
} 

void log::func(){ 
    display << "called by func"; 
} 
void log::show_display(){ 
    // redirect display to standard output 
} 

Y at-il de manière similaire ci-dessus pour le faire? Si non, comment puis-je avoir des résultats similaires?

Merci.

+3

"à la différence que std :: cout place directement les résultats à l'écran." - Non, il écrit sur la sortie standard - vous pouvez rediriger cela à partir de votre shell. –

+0

@NeilButterworth C'est tout à fait exact, je suis désolé pour l'erreur. Je vais éditer – Everyone

+0

Vous pouvez l'utiliser pour le flux qui ignore la sortie: http://stackoverflow.com/a/11826666/951890 –

Répondre

4

Les poignées de flux ne sont pas des objets copiables, et aucun objet std::ostream ne peut être instancié par l'utilisateur. Donc, votre classe écrite ne peut pas fonctionner. Ce que vous pouvez faire est à la place un pointeur:

#include <iostream> 

class log { 
    std::ostream* out_; 

public: 
    void func() { 
    if (out) { *out << "called by func"; } 
    // ... 
    } 

    void show_display() { 
    out = &std::cout; 
    } 

    void hide_display() { 
    out = nullptr; 
    } 
}; 

Si vous envisagez de construire un plus polyvalent système d'enregistrement, vous devriez considérer si la connexion à une sortie désactivée nécessite une évaluation des opérandes; les utilisateurs peuvent s'attendre à ce qu'une instruction de journal telle que log << expensive_function(); soit bon marché lorsque la journalisation est désactivée.

+0

Je dois admettre que j'avais ceci à l'esprit mais espérais d'une autre manière qui n'implique pas de vérifier si ce n'est pas un 'nullptr' chaque fois que je voulais me connecter. Je pourrais tout aussi bien finir par écrire une fonction 'write' qui fait la vérification et la met dans le flux. – Everyone

+0

@Tout le monde: Vous pouvez aussi créer votre propre objet de logger qui n'écrit rien et qui se connecte sans condition à celui-ci et branchez-le à la place du null pointeur. –

+0

Je pense que je finirai par faire cela parce que je contrôlerais les problèmes de sécurité des threads qui apparaissent avec 'std :: cout' – Everyone