Pb - APPEL NON VOULU DU DESTRUCTEUR

eupeup Messages postés 57 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 24 avril 2013 - 23 juil. 2010 à 20:54
eupeup Messages postés 57 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 24 avril 2013 - 26 juil. 2010 à 11:20
Salut à tous!!!

bon j'ai un tit soucis, et si quelqu'un pouvait m'éclairer, ce serait super sympa...

D'une part, j'ai une classe définissant un objet CExposition (avec un destructeur explicité).
D'autre part, j'ai un fichier qui contient une fonction calculExposition() ne prenant rien en argument et retournant un objet CExposition.
Et finalement dans mon main, afin de tester, j'ai codé un truc du genre :

CExposition test = calculExposition();

Et là, j'ai un problème, dans ma fonction tout se passe normalement jusqu'au return, et là patatra, lorsque le programme sort du corps de la fonction il y a un appel du destructeur de CExposition (sans que je le demande bien sur, hehe)...
J'imagine que c'est à cause de la copie... est ce bien cela? et que faire?
(j'ai déjà trouvé qulques feintes qui le permettent de réaliser ce que je veux faire, mais cela ne m'éclaire pas sur les raisons...)

De plus, dans un message précédent, on m'a précisé que pour avoir une classe bien conçue, je dois recoder l'operateur de copie...
Alors je vais poser une question conne, mais l'opérateur de copie est bien l'opérateur '=', c'est bien cela? et une manière de le coder serait pour la meme classe d'objet

const CExposition& CExposition::operator=(const CExposition& expo)
{
_argMembre1 = expo._argMembre1;
_argMembre2 = expo._argMembre2;
...

return *this;
}

Cela convient-il?

Merci d'avance

Peupeu

3 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
23 juil. 2010 à 23:22
Salut,

C'est effectivement ca ton problème : les variables locales (c'est ca que tu manipules ici) ont la durée de vie de la fonction dans laquelle elles sont déclarées, il est donc logique que ton objet soit détruit en sortie de la fonction.
Ecrire l'opérateur de copie est une solution, mais je la trouve pas terrible. Niveau perf on voit bien que c'est pourri, car ca entraine des recopies (d'autant plus si ton objet possède plein d'attributs).
Il y a plusieurs solutions :
- Au lieu de déclarer ton objet en local, tu l'alloues dynamiquement (new). C'est alors à l'appelant de le détruire explicitement avec delete.
- Mieux a mon avis : l'appelant déclare l'objet et passe son adresse en paramètre à la fonction, qui n'a qu'a manipuler l'objet
- Envisager aussi l'emploi d'une variable statique si c'est justifié.


_____________________________________
Un éditeur de ressources gratuit pour Windows
0
eupeup Messages postés 57 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 24 avril 2013
24 juil. 2010 à 18:52
Salut merci pour ta réponse...

Donc je pense que je vais opter pour la seconde solution, donc si j'ai bien compris je déclare un objet de la manière suivante, par exemple

CExposition expo(arg1, arg2, ...); //appel du constructeur
calculExposition(expo); //appel de la fonction

Sachant que le prototype de ma fonction est le suivant :

void calculExposition(CExposition& expo);

C'est bien cela?

Et sinon, concernant l'opérateur de copie, ce que j'ai mis dans mon premier message est il correct (dans l'esprit)?

Merci d'avance

Peupeu
0
eupeup Messages postés 57 Date d'inscription mardi 11 mars 2003 Statut Membre Dernière intervention 24 avril 2013
26 juil. 2010 à 11:20
Resalut à tous,

je suis encore sur mon problème... vos réponses m'ont bien aidé, mais mon probleme n'est toujours pas résolu...
Je pense voir le problème plus précisément...

Le problème que j'avais est le suivant, lors d'un appel de fonction, dans le corps de celle-ci, je crée un objet que je veux retourner... mais à la sortie de la fonction le destructeur de l'objet est appelé...

Donc j'ai bien compris les solutions proposées, le soucis en fait est que mon objet prend en argument dans son constructeur un vecteur de pointeur (d'un autre objet d'ailleurs)

Et donc lors d'un appel, mon vecteur est copié puis détruit (via le passage en copie)... et donc là patatra, les pointeurs qui composent mon vecteur sont détruits.

Donc je vois bien que j'ai peut etre un probleme de conception de ma classe, ce fameux vecteur de pointeur...
Y a t il une solution particulière?
Peut etre, devrai-je faire un pointeur de vecteur d'objet.... et ainsi passer le vecteur (en reference constante) en argument dans mon constructeur, puis allouer dynamiquement de la mémoire....
Ou autre chose....
Si qulqu'un pouvait m'éclairer....

Merci d'avance

Peupeu
0
Rejoignez-nous