begin process at 2012 05 29 15:16:25
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Général

 > 

Pb - APPEL NON VOULU DU DESTRUCTEUR


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Pb - APPEL NON VOULU DU DESTRUCTEUR

vendredi 23 juillet 2010 à 20:54:04 | Pb - APPEL NON VOULU DU DESTRUCTEUR

eupeup

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
vendredi 23 juillet 2010 à 23:22:12 | Re : Pb - APPEL NON VOULU DU DESTRUCTEUR

vecchio56

Administrateur CodeS-SourceS
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
samedi 24 juillet 2010 à 18:52:12 | Re : Pb - APPEL NON VOULU DU DESTRUCTEUR

eupeup

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
lundi 26 juillet 2010 à 11:20:31 | Re : Pb - APPEL NON VOULU DU DESTRUCTEUR

eupeup

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


Cette discussion est classée dans : objet, appel, classe, destructeur, cexposition


Répondre à ce message

Sujets en rapport avec ce message

Comment faire un tableau d'objet ?? [ par vinvay ] Voilà mon problème : j'ai une classe avec deux constructeurs, un qui ne fait rien et l'autre qui initialise une variable de cette classe.Je souhaite f C++ : Appel d'un autre constructeur de la classe [ par ymca2003 ] Salut, j'ai un petit problème pour appeler un autre constructeur d'une classe. Ex :// constructeur 1CMyClass::CMyClass(int x, int y){...}// constructe [MFC] appel de la classe CFormview [ par sliders75 ] Bonjour, J'ai un projet MFC avec une classe CFormulaire de type CFormview (Formulaire.cpp), et dans cette classe, j'ai une fonction void Ajouter() Cet une classe static [ par Adeon ] bonjour a tous!je suis sur le developpement d'un jeux.certaine classe ne contienne qu'un seul objet comme par exemple la classe Interface, ou encore l Urgent svppp : Utilisation de <list> [ par najla1986 ] j'ai une classe message, qui comme membre a, entre autre, un objet *expediteur.Lorsque je veux envoyer une occurence de cette classe sur ma liste, par Héritage et destructeur [ par vincemail ] Bonsoir à tous, j'aurai besoin de quelques précisions quant aux destructeurs d'une classe héritant d'une autre. J'ai une classe B qui hérite d'une cla Portée d'un objet créer [ par Nixeus ] Bonjour,Grosse question de newbie j'avoue, mais je rencontre un problème.Le logiciel que je développe, doit se voir créer un seul et unique Objet "CGe Objet COM [ par mayouma ] Bonjour à tous;je suis entrain d'implementer des DLL en VC++.Net, je voudrais connaitre comment faire un appel d'une methode d'une DLL à une autre. j' vector et objet de classe [ par cppdupdup34 ] voila mon pbclass tutu {...};int main{...vector prout;tutu objet;prout.push_back(objet);et la ...492 C:\Dev-Cpp\include\c++\bits\stl_vector.h instant est-ce que l'adresse d'un objet est la meme que les membres ? [ par rick_moins_moins ] Bonjour,je souhaiterais savoir si l'adresse d'une instance de classe est la meme que l'adresse d'une donnee membre de cette classe ?


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,967 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales