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 :

stream: avoir un ostream en membre d'une classe


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut stream: avoir un ostream en membre d'une classe
    Bonjour,

    Encore une question sur les stream.

    Voici mon 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
    #include <string>
    #include <fstream>
    #include <iostream>
    using namespace std;
     
    class CMaClasse
    {
    public:
    	CMaClasse()
    	{
    		m_maSortie = &cout;
    	}
    	void myPrint(void)
    	{
    		(*m_maSortie) << "Coucou" << endl;
    	}
    	void setSortie(ostream& sortie)
    	{
    		(*m_maSortie) = sortie;
    	}
     
    	ostream* m_maSortie;
    };
     
     
    int main()
    {
    	CMaClasse* test2 = new CMaClasse();
    	test2->setSortie(cout);
    	test2->myPrint();
     
    	return 1;
    }
    Je souhaiterai avoir une variable membre sur un stream de sortie. Mon code compile et fonctionne sans probleme. Mais je pense pas avoir bien fait le truc:
    1- j'utilise un pointeur de ostream, du coup faut faire plein de (*ostream),
    2- je suis oblige de l'initialiser dans le constructeur, sinon ca marche pas

    Un peu d'aide

    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    Hello kacedda,

    Comme expliqué dans le sujet précédent, tu ne peux pas détenir le stream pas valeur, sinon tu dois faire une copie du stream de départ, or les streams ne sont pas copiables. Donc il te reste les pointeurs (ta solution) ou les références.

    Cette seconde solution présente l'avantage que la syntaxe redevient celle à laquelle tu es habitué (monStream << "coucou").

    Une référence te force cependant à l'initialiser dans le constructeur, et plus précisément dans la liste d'initialisation. Avec un pointeur, tu pourrais le faire pointer vers le stream de ton choix le plus tard possible, mais tu dois quand même l'initialiser à 0 dans le constructeur...

    Carl

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut
    Salut,
    Merci pour ta réponse mais le problème c'est que je n'arrive pas à initialiser ma référence?! c'est peut-etre normal mais j'en sais rien, si j'ai bien compris il n'existe pas de stream de type "null"?

    Voici ce que j'ai fait:
    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
    class CMaClasse
    {
    public:
    	CMaClasse(ostream& s=cout) : 
    	  m_maSortie(s)
    	{
    	}
    	void myPrint(void)
    	{
    		m_maSortie << "Coucou" << endl;
    	}
    	void setSortie(ostream& sortie)
    	{
    		m_maSortie = sortie;
    	}
     
    	ostream& m_maSortie;
    };
    Dans mon constructeur je suis obliger de mettre cout par defaut, et je trouve ca super bizarre...

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut
    Non mais je crois que c'est bon
    En fait faut trop que j'aille reviser le fonctionnement des references. Je suis carrement a l'ouest la je crois...

  5. #5
    Invité
    Invité(e)
    Par défaut
    Le problèmes des références, c'est que tu ne peux les "faire pointer" vers quelque chose qu'une seule fois. Il s'en suit qu'il faut donc les "faire pointer" vers quelque chose dès que tu les crée.

    Or dans une classe, tous les membres sont "créés" juste avant d'entrer dans le corps du constructeur choisi pour l'exécution. Le seul endroit qu'il te reste pour "faire pointer" une référence qui est un membre de ta classe est dans la liste d'initialisation.

    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
     
    class MyClass
    {
    private:
      std::ostream& m_stream;
     
    public:
      MyClass(std::ostream& stream)
      : m_stream(stream)
      {
         // Ici c'est déjà trop tard pour "faire pointer" 
         // m_stream vers quelque chose!
      }
    };
     
    MyClass myVariable(cout);

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    646
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 646
    Par défaut
    Yes! merci pour le code, je suis arrivé au meme, du coup il est bon.

Discussions similaires

  1. [MFC] rendre un thread membre d'une classe.
    Par giova_fr dans le forum MFC
    Réponses: 6
    Dernier message: 20/02/2006, 18h37
  2. Objet vector<Type> membre d'une classe
    Par Chewbi dans le forum SL & STL
    Réponses: 3
    Dernier message: 16/02/2006, 17h12
  3. Pointeur sur des fonctions membres d'une classe
    Par Muetdhiver dans le forum C++
    Réponses: 3
    Dernier message: 15/02/2006, 11h35
  4. [VB.NET]Reflexion lister les membres d'une classe ...presque
    Par lucie.houel dans le forum ASP.NET
    Réponses: 19
    Dernier message: 20/09/2005, 13h49
  5. Thread avec une fonction membre d'une classe
    Par SteelBox dans le forum Windows
    Réponses: 6
    Dernier message: 01/03/2004, 01h15

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