Problème pour l'utilisation d'un constructeur de recopie

Résolu
vincemail Messages postés 79 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 8 décembre 2006 - 10 mars 2006 à 22:05
vincemail Messages postés 79 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 8 décembre 2006 - 11 mars 2006 à 14:58
Bonsoir à tous, j'ai un petit problème concernant le constructeur de recopie d'une classe, ou plutot son utilisation. Voilà, je crée une classe Vecteur avec un constructeur de recopie : "Vecteur::Vecteur(const Vecteur&)". Le problème c'est que je souhaite recopier un vecteur dans un tableau de vecteurs :
Vecteur* tableau; // Ca c'est mon tableau de vecteurs
Vecteur vecteur(0,1,2); // Là un vecteur avec initialisation des membres

tableau=new Vecteur[10];

tableau[0]=Vecteur(vecteur); // Et là je tente de recopier vecteur dans une case du tableau

Le problème c'est qu'apparemment il s'agit d'une affectation et non de la création d'un objet recopié (qu'il faudrait faire avec "new"), alors dès que l'objet temporaire Vecteur(vecteur) est affecté à tableau[0], il est détruit par le destructeur de la classe Vecteur, et donc tous les pointeurs de tableau[0] (que je n'ai pas explicités ici) sont détruits avec... Je ne peux pourtant pas écrire "tableau[0]=new Vecteur(vecteur)" qui me retourne une erreur...

Si quelqu'un sait comment faire, je l'en remercie d'avance.
Vincent

4 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
10 mars 2006 à 22:29
Faut pas faire n'importe quoi et attendre que le compilo soit pas content.

Evidemment que ca marche pas et que ca ne peut pas marcher. Quand tu créés ton tableau avec new Vecteur[10];

Les objets sont deja créer par NEW, donc pourquoi veux tu encore utiliser un constructeur ?

Sinon tu as raison, "tableau[0]=Vecteur(vecteur);" c'est une
affectation donc faut surcharger l'opérateur "=" et non utiliser le
constructeur par recopie.

Et donc tu utilises l'opérateur de la facon suivante:

tableau[0]=vecteur;



Je comprend pas ce que tu dis dans la suite au sujet du destructeur.
Tant que l'objet tableau n'est pas détruit par delete[], tous les
élements existent.
3
vincemail Messages postés 79 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 8 décembre 2006
10 mars 2006 à 22:40
Ah vi, j'avais oublié qu'on pouvait surdéfinir l'opérateur "="... Je vais essayer, ca résoudra sûrement mon problème.

Ce que je disais au sujet du destructeur c'est qu'apparemment, lorsqu'on écrit :
tableau[0]=Vecteur(vecteur);
C'est comme si ca faisait :

vecteurTemporaire=new Vecteur(vecteur);
tableau[0]=vecteurTemporaire;
delete vecteurTemporaire;

Et du coup tous les pointeurs membres de la classe Vecteur sont supprimés...

Merci encore.
Vincent
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
10 mars 2006 à 23:58
Oui mais je vois pas pourquoi sur des vecteurs, tu aurais des
pointeurs. Et puis tes pointeurs ne concernent que l'objet
vecteurTemporaire normalement. Donc c'est tout a fait normal.
0
vincemail Messages postés 79 Date d'inscription mardi 29 juillet 2003 Statut Membre Dernière intervention 8 décembre 2006
11 mars 2006 à 14:58
Non en fait l'objet Vecteur c'était pour l'exemple... en réalité il s'agit d'un objet qui comporte des pointeurs. Et lorsque je fait tableau[0]=vecteurTemporaire, ce ne sont pas les valeurs des pointeurs qui sont recopiées mais les adresses et du coup tableau[0] et vecteurTemporaire ont des pointeurs qui pointent sur le meme objet.Donc lorsque cet objet est détruit lorsque vecteurTemporaire est automatiquement détruit, et bien les pointeurs de tableau[0] ne pointent sur plus rien du tout...
Sinon je viens de surdéfinir l'opérateur=, et tout marche super bien maintenannt. Merci
0
Rejoignez-nous