Partage
  • Partager sur Facebook
  • Partager sur Twitter

Question sur les surchages d'opérateurs et l'objet ostream (cout)

Sujet résolu
    19 août 2007 à 18:26:51

    Bonjour ! :)


    Je me posais une question sur l'objet ostream, comment fait il pour faire plusieurs chaîne de suite avec un opérateur (/méthode) ?

    Par exemple, imaginons que je créer une classe "print_string", et qu'elle contienne cette méthode : operator<<(string chaine);

    1. class print_string
    2. {
    3.     public:
    4.         operator<<(string chaine)
    5.         {
    6.             printf("%s", chaine.c_str());
    7.         }
    8. };


    je peut donc faire dans la fonction principal :

    1. print_string print;
    2. print << "bonjour !";


    tout comme je peu faire avec cout :

    1. cout << "bonjour !";


    Mais là où je bloque, c'est quand je veux faire ça :
    1. print_string print;
    2. print << "bonjour !" << " je m'appelle antoinexp .";
    3. /* comme avec cout : */
    4. cout << "bonjour !" << " je m'appelle antoinexp .";


    Mais cela ne fonctionne pas évidemment car cela équivaut à faire :

    1. print.operator<<("bonjour !".operator<<(" je m'appelle antoinexp ."));


    Alors la question que je me pose est : quel est donc la méthode de l'operateur << de l'objet ostream qui permet bien d'afficher plusieurs chaîne à la suite ?
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      19 août 2007 à 18:34:47

      Bonjour

      Je ne connais pas le procédé qu'utilise cout et autre flux, mais s'il fait comme je pense ta technique ne marchera jamais.

      A mon avis si tu fait cout << "blabla" blabla va être appendue à la fin du flux. Donc pas affiché directement.

      Enfin p'têtre que je me plante bien profond dans mon résonnement ...

      Hiura
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        19 août 2007 à 18:51:13

        Une fonction de flot doit toujours être défnie comme fonction libre car son 1er argument doit être une réfernce sur un ostream(ou istream).
        Pourquoi libre ?
        Car le 1er argument d'une fonction membre d'une classe est le pointeur this.

        Ensuite pour gérer ce que tu décrit , c'est comme pour l'opérateur d'affectation , il renvoit une référence sur le flux.

        Le patron d'une classe xstream est alors :
        1. ostream &  operator << (ostream & flux, taclasse tonobjet) //ou operator >> si c'est  un istream
        2. {
        3. //tout ce que tu veux.
        4. return flux;
        5. }


        • Partager sur Facebook
        • Partager sur Twitter
          19 août 2007 à 19:34:33

          Mmmh, je dirais plutôt qqch comme:

          1. friend ostream& operator<<(ostream&, MaClasse const&);


          Il vaut mieux utiliser une référence constante pour éviter une copie inutile.
          • Partager sur Facebook
          • Partager sur Twitter
          Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
          Anonyme
            19 août 2007 à 20:15:40

            La déclaraton d'amitié est recomandé mais non obligatoire.
            En effet , on peut créer un conglomérat de variable (une structure par défault) et voir besoin de définir les opérateurs de flux .
            Dans ce cas , l'amitié est facultative puisque tout est publique.
            • Partager sur Facebook
            • Partager sur Twitter
              19 août 2007 à 20:48:13

              Cf le post de Nanoc pour la bonne signature.
              Au détail de l'amitié qui n'est pas une fatalité ici -- je n'irai pas jusqu'à dire recommandée. Il suffit que la classe fournisse accesseurs (/resp. constructeur d'initialisation) pour définir l'opérateur d'insertion (/resp d'extraction)
              • Partager sur Facebook
              • Partager sur Twitter
              C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
              Anonyme
                19 août 2007 à 21:55:35

                Citation : lmghs

                Cf le post de Nanoc pour la bonne signature.
                Au détail de l'amitié qui n'est pas une fatalité ici -- je n'irai pas jusqu'à dire recommandée. Il suffit que la classe fournisse accesseurs (/resp. constructeur d'initialisation) pour définir l'opérateur d'insertion (/resp d'extraction)


                J'avais crue mettre une référence pourtant elle est pas là. :colere2:
                Sinon , les accesseurs , à moins de les rendres inlines , ne vont t'il pas ralentir le programmme ?
                Car s'il y a beaucoup de variables à gérer, ca fait 2 sauts par accesseurs( un call , puis un ret)
                • Partager sur Facebook
                • Partager sur Twitter
                  19 août 2007 à 22:04:05

                  T'inquiête, une manipulation de flux coûte bien plus cher qu'un passage via un accesseur -- et c'est encore pire quand c'est pour finir sur l'écran ou dans un fichier.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                    19 août 2007 à 22:21:33

                    Heu, j'ai pas tout compris là, voir pas du tout ! :o

                    imaginons en faite que je veille reprogrammer une class ostream, comment devrais-je faire pour afficher des chaines de caractère avec operator<< ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      19 août 2007 à 22:40:20

                      Citation : mghs

                      c'est encore pire quand c'est pour finir sur l'écran ou dans un fichier.


                      ostream ne peut de toute facon viser que l'ecran ou un fichier ?
                      Ou peut il viser autres chose ?
                      Si oui , je ne vois pas quoi.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        19 août 2007 à 22:51:45

                        Tu as aussi les flux pour envoyer sur un réseau, ou même tout simplement sur une string, ça existe...

                        Sinon, "le premier argument d'une méthode c'est le pointeur this" ce n'est valable que pour les opérateurs, et encore que les opérateurs post-fixés...

                        À part ça, les flux donnent leurs ordre à l'écran via d'autres mécanismes qu'un simple printf(), si tu veux tu peux fouiller dans les sources des bibliothèques C++ de GCC pour t'en donner une idée, mais bonne chance pour comprendre...
                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 août 2007 à 0:32:23

                          Si tu veux définir ton type de flux, ne vas pas dériver std::ostream, mais std::streambuf. Cf la FAQ de fclc++.
                          • Partager sur Facebook
                          • Partager sur Twitter
                          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                            20 août 2007 à 18:35:39

                            Hum, bon, à ce que je vois ça a l'air assez compliqué ! Je ne m'y attendais pas !
                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 août 2007 à 19:40:11

                              Oui la mécanique interne des stream est relativement complexe. Mais en réalité on s'enfout. C'est le principe de l'encapsulation. Tu n'as pas besoin de savoir comment fonctionne chaque pièce de ta voiture pour pouvoir rouler avec.
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.

                              Question sur les surchages d'opérateurs et l'objet ostream (cout)

                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                              • Editeur
                              • Markdown