Partage
  • Partager sur Facebook
  • Partager sur Twitter

Cast un int dans ma propre classe

    1 septembre 2022 à 15:15:51

    Bonjour, j'aimerais savoir comment je peux cast implicitement un int dans ma propre classe. J'ai beau chercher, je ne trouve pas.

    En gros l'idée serait de faire du calcul symbolique et de construire un arbre pour représenter l'expression.

    Merci d'avance.

    • Partager sur Facebook
    • Partager sur Twitter
      1 septembre 2022 à 16:04:59

      Caster un int ? en quoi ?

      static_cast peut-être ? 

      Tu n'as pas moyen de faire sans cast ?

      • Partager sur Facebook
      • Partager sur Twitter
      ...
        1 septembre 2022 à 16:14:38

        Salut,

        De manière générale, c'est toujours une très mauvaise idée de vouloir caster des données dans un autre type, surtout lorsqu'il s'agit de caster un type primitif (comme un int) en un type "défini par l'utilisteur" comme une classe.

        Par contre, ce que tu peux faire, c'est t'arranger pour que ta propre classe dispose de cette donnée (le int en question) et pour que la valeur "de départ" de ton int soit définie dés la création d'une instance de ta classe, par exemple, en ajoutant la nécessité de la fournir en paramètre au constructeur.

        Tu pourrais donc avoir un code qui serait proche de

        class MaClasse{
        public:
             /* tout se passera grace à ce constructeur */
             MaClasse(int value):m_value{value}{
             }
             /* pour quand même pouvoir récupérer la valeur
              * introduite
              */
             int value() const{ return m_value;}
             /* d'autres choses peuvent venir ici */
        private:
             /* pour pouvoir stocker la valeur introduite
             int m_value;
        };

        Un code "aussi simple " que cela te permettra énormément de chose, comme le fait de fournir une valeur  "écrite en dur" pour une instance particulière de ta classe, par exemple:

        #include <iostream>
        
        int main(){
            MaClasse obj{15}; // la valeur est automatiquement 
                              // définie à 15
            /* on peut s'en rendre compte "facilement" en faisant
             * appel à la fonction value:
             */
            std::cout<<"valeur actuelle "<<obj.value()<<"\n";
        }

        Mais cela te permettra également d'utiliser n'importe quelle donné de type adéquat pour définir la valeur, par exemple:

        #include <iostream>
        
        int main(){
            int val{152};
            /* on manipule val selon nos besoins  */
            MaClasse obj{val}; // la valeur est automatiquement 
                               // définie à celle de val (152,
                               // dans le cas présent)
        
            std::cout<<"valeur actuelle "<<obj.value()<<"\n";
        }

        Enfin, tel que le code de MaClasse est pour l'instant présenté, il permettra malgré tout le transtypage (le cast) implicite, ce qui implique qu'un code proche de

        #inlcude <iostream>
        
        int main(){
            int val{153};
            MaClasse obj = val;
            std::cout<<valeur de obj :"<<obj.value()<<"\n";
        }

        compilera et donnera même les bons résultats ;)

        Cependant, laisser ce comportement survenir n'est sans doute vraiment pas la meilleure idée que l'on puisse avoir pour différentes raisons.  Nous serions donc sans doute bien inspirés de déclarer le constructeur de MaClasse comme explicit, ce qui aura pour effet de nous obliger à indiquer explicitement que nous souhaitons créer une instance de MaClasse avec la valeur entière indiquée.

        Les changements à apporter au code de MaClasse sont finalement très simples, vu qu'il ressemblerait à quelque chose comme

        class MaClasse{
        public:
            explicit MaClasse(int value):m_value{value}{
            }
            int value() const{
                return m_value;
            }
        private:
            int m_value;
        };

        Cependant, le simple ajout du terme explicite aura pour conséquence de faire en sorte que, si les deux premiers code d'exemples continuent à fonctionner "sans problème", le troisième ne compilera plus.


        • Partager sur Facebook
        • Partager sur Twitter
        Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
          9 septembre 2022 à 15:56:46

          JimmyNeutron7 a écrit:

          Bonjour, j'aimerais savoir comment je peux cast implicitement un int dans ma propre classe. J'ai beau chercher, je ne trouve pas.

          En gros l'idée serait de faire du calcul symbolique et de construire un arbre pour représenter l'expression.

          Merci d'avance.


          C'est pas très clair. Et si tu donnais un exemple ?

          Mon interprétation de la question :

          • Dans le programme on manipule des termes (arbres de syntaxe).
          • Certains de ces termes sont/représentent des entiers.
          • on voudrait que, dans certains contextes où des termes sont attendus, on puisse mettre des entiers (int) directement, qui seraient automatiquement promus.

          à voir.

          Ou alors

          • une classe abstraite AST
          • une classe Number_AST qui dérive de AST, et dont le constructeur prend un int.

          -
          Edité par michelbillaud 9 septembre 2022 à 16:51:35

          • Partager sur Facebook
          • Partager sur Twitter

          Cast un int dans ma propre classe

          × 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