Partage
  • Partager sur Facebook
  • Partager sur Twitter

Formatter un message avec ou sans strings?

    20 décembre 2022 à 11:43:44

    Bonjour, je fais un jeu textuel et je cherche à construire des phrases pour les afficher au joueur. Le plus simple serait d'avoir une fonction qui fait tout et qui affiche le message directement mais je trouve que c'est pas très propre. En fait, une phrase est composée de plusieurs parties, et ces parties peuvent elles même se construire de différentes manières. Un exemple de phrase serait "[nom_joueur] [caractéristiques] : [message]"

    Pour afficher cette phrase, il faut afficher le nom du joueur, ses caractérisitiques, un ":", puis le message. Sachant que toutes ces données peuvent changer, j'avais pensé à faire une fonction qui renvoie ces données sous forme de std::string. Ce qui ferait que d'abord on construit le nom du joueur dans une std::string, ensuite les caractéristiques dans une autre std::string, et le message dans une autre std::string, et ensuite on peut l'afficher :

    std::string nom = joueur.getNomString();
    std::string caract = joueur.getCaractString();
    std::string message = joueur.getMessage();
    
    std::cout << nom << std::cout << " " << caract << " : " << message << "\n";

    Le problème de faire comme ça c'est que ça m'oblige à créer une std::string pour chaque "donnée" et j'aimerai bien plutôt que ça puisse écrire directement dans le résultat. J'avais pensé à passer une std::stringstream à toutes les fonctions qui "écrivent" quelque chose mais je sais pas si c'est une bonne idée, et j'ai pas nom plus envie de forcer tout le code à utiliser des std::stringstream, du coup on pourrait peutêtre prendre en template un objet qui peut être soit un std::stringstream soit autre chose si on veut  ?

    Je sais pas si c'est clair, en gros j'ai des fonctions qui "font du formattage", soit pour l'affichage du nom, soit pour les caractéristiques ect et ces fonctions peuvent se "composer", par exemple ici pour obtenir la phrase finale on construit d'abord le nom, les caractéristiques ect et je n'aime pas devoir créer des std::string pour chaque résultat intermédiaire mais en même temps ça me parait bizarre de prendre en paramètre un stringstream ou autre, du coup je sais pas quoi faire

    -
    Edité par MaximeGaran 20 décembre 2022 à 11:44:29

    • Partager sur Facebook
    • Partager sur Twitter
      20 décembre 2022 à 11:56:55

      Salut,

      Une fonction qui fait du formatage, ce n'a rien de compliqué.
      Ca prend des paramètres pour construire le message et ça le retourne.

      Ecrit quelque chose qui ressemble à cela.

      • Partager sur Facebook
      • Partager sur Twitter
        20 décembre 2022 à 12:46:20

        > je n'aime pas devoir créer des std::string pour chaque résultat intermédiaire mais en même temps ça me parait bizarre de prendre en paramètre un stringstream ou autre, du coup je sais pas quoi faire

        Arrêter de trouver ça bizarre, d'aimer ou pas aimer, et à la place, se poser et réfléchir trente secondes. Personne n'oblige à passer par des variables intermédiaires.

        std::cout << joueur.getNomString()
                  << " " 
                  << joueur.getCaractString()
                  << " : " 
                  << joueur.getMessage()
                  << std::endl;



        -
        Edité par michelbillaud 20 décembre 2022 à 12:48:45

        • Partager sur Facebook
        • Partager sur Twitter
          20 décembre 2022 à 12:52:32

          michelbillaud a écrit:

          > je n'aime pas devoir créer des std::string pour chaque résultat intermédiaire mais en même temps ça me parait bizarre de prendre en paramètre un stringstream ou autre, du coup je sais pas quoi faire

          Arrêter de trouver ça bizarre, d'aimer ou pas aimer, et à la place, réfléchir trente secondes. Personne n'oblige à passer par des variables intermédiaires.

          std::cout << joueur.getNomString()
                    << " " 
                    << joueur.getCaractString()
                    << " : " 
                    << joueur.getMessage()
                    << std::endl;



          -
          Edité par michelbillaud il y a moins de 30s

          Oui mais même si je fais ça, ça va quand même crée des std::string pour chaque "donnée" vu que ça renvoie une std::string? Parce que par exemple pour les caractéristiques, c'est composé de plein de choses aussi et c'est formatté d'une certaine manière, et du coup au lieu que chacune de ces choses renvoie une std::string qui sera composée dans un autre std::string ect, peutêtre que c'est mieux de passer un truc comme stringstream à tout le monde comme ça ils peuvent écrire directement dedans ?

          • Partager sur Facebook
          • Partager sur Twitter
            20 décembre 2022 à 13:48:04

            As tu pensé à ce que tes assesseurs retournent des références constantes ?  Comme ça ils ne fabriquent pas de copies.

            • Partager sur Facebook
            • Partager sur Twitter
              20 décembre 2022 à 14:08:10

              michelbillaud a écrit:

              As tu pensé à ce que tes assesseurs retournent des références constantes ?  Comme ça ils ne fabriquent pas de copies.

              Ah non j'avais pas pensé à ça mais je sais pas si c'est possible car la chaine de caractère peut changer à tout moment en fonction des caractéristiques 

              • Partager sur Facebook
              • Partager sur Twitter
                20 décembre 2022 à 14:25:18

                MaximeGaran a écrit:

                michelbillaud a écrit:

                As tu pensé à ce que tes assesseurs retournent des références constantes ?  Comme ça ils ne fabriquent pas de copies.

                Ah non j'avais pas pensé à ça mais je sais pas si c'est possible car la chaine de caractère peut changer à tout moment en fonction des caractéristiques 

                • il faut penser
                • quand on ne sait pas si c'est possible, il faut essayer
                • la "chaine peut changer" c'est du blabla.  Si getMessage est un accesseur qui retourne la valeur d'une donnée membre, ça le fait. Sinon si ça construit un message, ça fabrique une chaine, et c'est pas vraiment un problème.
                Conseil : ne t'embarque pas dans des considérations de performances/économies à bas niveau pour l'instant, avant de comprendre réellement ce que le compilateur fait de ton code.  Commence par écrire du code qui marche, c'est déjà du boulot.

                -
                Edité par michelbillaud 20 décembre 2022 à 14:29:17

                • Partager sur Facebook
                • Partager sur Twitter

                Formatter un message avec ou sans strings?

                × 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