eupeup
Messages postés57Date d'inscriptionmardi 11 mars 2003StatutMembreDernière intervention24 avril 2013
-
23 juil. 2010 à 20:54
eupeup
Messages postés57Date d'inscriptionmardi 11 mars 2003StatutMembreDernière intervention24 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
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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é.
eupeup
Messages postés57Date d'inscriptionmardi 11 mars 2003StatutMembreDernière intervention24 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....