Problème pour l'utilisation d'un constructeur de recopie [Résolu]

Signaler
Messages postés
79
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
8 décembre 2006
-
Messages postés
79
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
8 décembre 2006
-
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

Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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.
Messages postés
79
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
8 décembre 2006

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
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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.
Messages postés
79
Date d'inscription
mardi 29 juillet 2003
Statut
Membre
Dernière intervention
8 décembre 2006

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