Partage
  • Partager sur Facebook
  • Partager sur Twitter

Question sur le chapitre "classes et pointeurs"

Est-ce que je fais une bourde ?

Sujet résolu
    9 juin 2008 à 23:35:06

    Bonjour,

    Je suis en train de lire le cours de C++ et j'ai codé le petit "jeu" qui sert de base, un peu modifié.
    Au départ on a une classe "Personnage" et une classe "Arme", avec Personnage.m_arme de type "Arme", et une fonction "changerArme" qui chez moi était (j'ai mis comme paramètre un objet "Arme" en supposant qu'elle existe déjà, au lieu de mettre le nom de l'arme et ses dégâts et de la créer comme dans le cours ; mais peu importe) :
    void Personnage::changerArme(Arme &nouvelleArme)
    {
       m_arme=nouvelleArme;
    }
    



    Dans le chapitre "classes et pointeurs", Mateo demande de transformer m_arme en pointeur. Et là je ne sais pas trop quoi faire, j'ai 2 solutions qui compilent toutes les deux :

    void Personnage::changerArme(const Arme &nouvelleArme)
    {
       delete m_arme;
       m_arme=new Arme(nouvelleArme);
    }
    

    Ici, d'après ce que j'ai compris, je détruis l'ancienne arme et je crée un nouveau pointeur sur une copie de la nouvelle arme.

    void Personnage::changerArme(const Arme &nouvelleArme)
    {
       *m_arme=nouvelleArme;
    }
    

    Ici je remplace l'ancienne arme qu'il y avait à l'adresse où pointe m_arme par la nouvelle.

    Y a-t-il une des solutions qui est mauvaise ?
    Avec la 2e, ne risque-t-on pas un dépassement de mémoire si le nouvelle arme prend plus de place que l'ancienne (comme si on voulait écrire dans une chaîne pas assez longue) ?
    • Partager sur Facebook
    • Partager sur Twitter
      10 juin 2008 à 3:32:23

      La première version utilise le constructeur de copie de la classe.

      La seconde, l'opérateur =.

      Les deux sont donc équivalents. Je préfèrerais quand même la deuxième, car elle n'utilise pas d'allocation dynamique de mémoire (le genre de chose qu'on tente d'éviter quand on le peut). Quand au dépassement de tampon, ça n'arrivera pas. Un int prend toujours 4 octets, et une std::string a une gestion sécuritaire de sa mémoire (tout comme tous les types standards).

      Attention par contre, si tu as créé au départ une arme avec new, et que tu la remplace avec la deuxième méthode, tu créé une fuite de mémoire, car la mémoire ne sera pas libérée.
      • Partager sur Facebook
      • Partager sur Twitter
        10 juin 2008 à 8:17:38

        Là dans Arme il n'y a pas de pointeur, donc pas de new... et pas de problème ! :D

        Merci de cet éclaircissement. ;)
        • Partager sur Facebook
        • Partager sur Twitter

        Question sur le chapitre "classes et pointeurs"

        × 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