elnino67
Messages postés3Date d'inscriptionjeudi 22 mai 2008StatutMembreDernière intervention29 mai 2008
-
22 mai 2008 à 21:24
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 2008
-
23 mai 2008 à 18:24
Bonsoir,
Nous utilisons un programme ayant recours à une multimap utilisant:
[code] multimap<string, class Client> m;[\CODE]
en clé: le champ nom d'une classe Client, et en objet: Client.
<!-- BEGIN TEMPLATE: bbcode_code -->
Code :
class Client
{private:
int m_id;
string m_nom;
string m_prenom;
Adresse *m_adress;
<!-- END TEMPLATE: bbcode_code -->Mais le problème devient que le contenu de la multimap ne change pas pour ce qui est de la donnée, la clé change mais l'objet affiché correspond au dernier client saisi.
Merci d'avance pour votre aide, qui nous serait très précieuse!!
BunoCS
Messages postés15475Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention23 avril 2024103 23 mai 2008 à 17:03
Salut,
Y'a un truc qui me chiffonne: dans la fonction "nouveauClient", tu crée une variable locale, tu joue avec...et tu la retournes!! Pas bien... En effet, toute variable locale est détruite en sortie de fonction: il faut, soit passer un objet en paramètre de ta fonction, soit allouer un pointeur et retourner ce pointeur.
Mais bon, si ta map doit contenir beaucoup d'objet, c'est mieux d'y stocker des pointeurs...
En espérant avoir répondu à la question.
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
Le site de mon mariage
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 23 mai 2008 à 17:21
"En effet, toute variable locale est détruite en sortie de fonction: il
faut, soit passer un objet en paramètre de ta fonction, soit allouer un
pointeur et retourner ce pointeur."
=> Mais non, je sais pas d'ou ca sort ca. On a vu plusieurs fois cette remarque et c'est faux. Aucun pb à retourner un objet local tant qu'on en stocke pas le pointeur.
Pour ton pb, soit ta classe est incorrecte. Soit le pb est ailleurs, mais tu postes trop peu de code pour qu'on puisse analyser quoi que ce soit.
elnino67
Messages postés3Date d'inscriptionjeudi 22 mai 2008StatutMembreDernière intervention29 mai 2008 23 mai 2008 à 17:32
J'ai manipulé un petit peu ma fonction en renvoyant un pointeur, et effectivement cela a résolu tous mes problèmes..
Pour autant luthor ton avis m'intéresse!On m'a moi aussi appris qu'une variable définie localement n'a une durée de vie équivalente uniquement à la fonction où elle est définie..Pourrais-tu m'en dire plus sur ce en quoi tu crois toi?
luhtor
Messages postés2023Date d'inscriptionmardi 24 septembre 2002StatutMembreDernière intervention28 juillet 20086 23 mai 2008 à 18:24
int main()
{
float value = sqrtf(10.0f);
return 0;
}
Si l'objet retourné était invalide, on ne pourrait pas écrire ces quelques lignes puisque la valeur retourner par sqrtf est bien locale à la fonction... Or ce qui est vrai ici l'est aussi pour n'importe quel objet. Un objet alloué localement et retourné par la fonction reste valide jusqu'à sa destruction, c'est à dire après que l'on ait pu en récupérer la valeur.
Pour clarifier, voici un exemple clair. Tu peux éxécuter ce code, le résultat est à la fin du post.
Test & operator = (const Test &)
{
std::cout << "affectation" << std::endl;
return *this;
}
};
Test BuildObject()
{
std::cout << "fonction" << std::endl;
Test ret;
return ret;
}
int main(int argc, char *argv[])
{
{
Test obj1;
obj1 = BuildObject();
}
system("PAUSE");
return 0;
}
Et voici un résultat de run:
constructeur => Constructeur de "Test obj1:"
fonction => Dans la fonction BuildObject
constructeur => Constructeur de l'objet local a la fonction "Test ret;"
affectation => Objet local renvoyé par la fonction, envoyé en argument à l'affectation (opérateur = )
destructeur =>Destructeur de l'objet retourné par la fonction destructeur => Destructeur de "Test obj1;"
Appuyez sur une touche pour continuer...
Comme on le voit et heureusement, le destructeur de l'objet qui est retourné par la fonction est appelé après l'affectation !
Ce qui n'est pas possible c'est de décupérer l'adresse de cet objet, puisqu'il va etre détruit après etre passé dans l'opérateur d'affectation (=).
Donc oui tes lignes étaient correctes, le pb est ailleurs. C'est le débuggeur qui aurait pu te donner les pistes pour comprendre le vrai problème.