Partage
  • Partager sur Facebook
  • Partager sur Twitter

je lutte avec le constructeur de copie

et je perds...

Sujet résolu
    30 juillet 2007 à 12:12:49

    Bonjour à tous.
    Je suis nouveau en C++, j'ai plus l'habitude du C...
    J'utilise un vector pour stocker des instances de ma classe : MaClasse
    J'ai remarqué qu'au second appel de la methode resize de mon vecteur, le programme plantait. Je me suis renseigné et j'ai vu que c'était parce que MaClasse n'avait pas de constructeur de copie.
    Je réalise donc un constructeur de copie !
    Mais le problème est que je n'y arrive pas. Je pense que c'est surtout à cause des nouvelles notions pour moi que sont "const" et les références. Après quelque recherche sur google, je pensais en connaitre assez... Le compilo me dit :


    passing const MaClasse as this argument of char* MaClasse::gettext() discards qualifiers.


    .h:

    class MaClasse
    {
       private :
          /*...*/
          char* texte
       public :
          /*...*/
          MaClasse(const MaClasse&);
          void settext(char*);
          char* gettext();
    };
     


    .cpp :

    char* MaClasse::gettext()
    {
        return this->text;
    }

    void test::settext(char* val)
    {
        int taille = 0;
        free(this->text);

        while (val[taille] != '\0')
            taille++;

        this->text = (char*)malloc((taille + 1) * sizeof(char));

        for (int i = 0 ; i < (taille + 1) ; i++)
            this->text[i] = val[i];
    }

    MaClasse::MaClasse(const MaClasse& copie)
    {
       this->settext(copie.gettext());
    }
     


    Je sais que vous allez me dire que ma méthode MaClasse::settext() est moche et que je devrais utiliser new et delete mais je ne pense pas que le problème vienne de là, je pense que c'est surtout avec l'utilisation du mot clef "const" enfin si je me trompe...

    bref si vous avez une idée merci a vous !
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      30 juillet 2007 à 12:48:32

      Je vois un malloc !!
      Horreur !! Je me meurt.

      Nan mais plus sérieusement , au lieu d'utiliser tes char* , passe plutôt aux std::string.
      Et si tu ne peux pas pour une raison quelquonque , utilise au moins new/delete.

      Apres, pour le message , c'est car tu passe une réference constante a ton constructeur de recopie.
      Il faut donc que la méthode gettext soit constante pour pouvoir être appelé par un objet constant.
      Il faut donc quelle devienne :
      char* gettext() const;


      De plus comme this et copie sont du même type (Maclasse) tu n'est pas obligé de passer l'accesseur dans ton constructeur de copie puisque le C++ réalise une encapsulation au niveau de la classe et non de l'objet.
      Tu peut donc faire :

      MaClasse::MaClasse(const MaClasse& copie)
      {
         this->settext(copie.texte);
      }

      • Partager sur Facebook
      • Partager sur Twitter
        30 juillet 2007 à 13:01:52

        Merci de ta réponse je vais passer au new/delete promis :p
        sinon un truc que je n'ai pas compris :

        "Il faut donc que la méthode gettext soit constante" (j'arrive pas a faire de sitation...)

        ca veut dire quoi ? que le char* retourné par la fonction sera constant ?
        merci de ton aide.
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          30 juillet 2007 à 13:04:33

          Cela signifie que la méthode à l'interdiction modifier l'état des variables non déclaré mutable(donc globalement tout l'objet).
          Cela se fait en ajjoutant const a la fin du prototype de ta fonction.
          Ca donne quelque chose du genre : T fct(...) const ; ou T est un type quelquonque.
          • Partager sur Facebook
          • Partager sur Twitter
            30 juillet 2007 à 13:16:26

            Merci de ton aide ca compile ET ca marche ! :D
            Même avec les new/delete.
            J'ai d'ailleur remarqué que delete [] planté quand le tableau n'était pas alloué mais bon.
            Encore merci de ton aide !
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              30 juillet 2007 à 13:21:07

              Citation : boule_t


              J'ai d'ailleur remarqué que delete [] planté quand le tableau n'était pas alloué mais bon.


              Bizarre.
              Car normalement un delete 0 ou delete[] 0 est safe.
              http://www.thescripts.com/forum/thread60880.html

              Quand tu dit non alloué , c'est que tu n'a pas alloué de mémoire ou que tu na même pas fait pointer le pointeur sur 0.

              Car si c'est dans ler 2er cas , le pointeur pointe sur on ne sait pas quoi et la oui , si tu fait un delete desssue ==> boom.
              • Partager sur Facebook
              • Partager sur Twitter
                30 juillet 2007 à 14:56:37

                Ouai j'ai regardé aussi après et j'avais oublié d'initialiser mon pointeur... oops :-°
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  30 juillet 2007 à 16:07:47

                  On pourrai presque dire que tu porte bien ton nom.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    30 juillet 2007 à 16:55:19

                    Puis-je ajouter qu'un delete ne remet pas le pointeur à zéro... il va continuer de pointer le même espace mémoire qui sera désalloué. Il faut donc remettre le pointeur à 0;

                    Seule petite remarque car il se peut (dans un autre code) que tu veulent vérifier si ton pointeur est alloué alors qu'il ne l'est pas...
                    • Partager sur Facebook
                    • Partager sur Twitter
                      31 juillet 2007 à 11:04:03

                      Citation : Davidbrcz

                      On pourrai presque dire que tu porte bien ton nom.


                      ba ouai grave ! :D
                      • Partager sur Facebook
                      • Partager sur Twitter

                      je lutte avec le constructeur de copie

                      × 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