URGENT : Classes, Pointeurs, et fonctions membres !!
guiguimac
Messages postés85Date d'inscriptionmercredi 29 août 2001StatutMembreDernière intervention22 avril 2006
-
26 avril 2003 à 22:51
guiguimac
Messages postés85Date d'inscriptionmercredi 29 août 2001StatutMembreDernière intervention22 avril 2006
-
27 avril 2003 à 15:36
bonsoir ... mon pbm avance mais là je cale grave !
j'ai une classe cA avec comme membres (pour l'instant tout en public) :
une string "NOM"
une fonction "print_name"
j'ai créé 3 objets de cette classe.
j'ai une classe cB avec 3 membres de type pointeur (p1, p2; p3) sur un objet de cA. lors de la construction d'un objet de cB, je fais pointer chaque membre sur un de mes trois objets de cA.
ensuite je peux faire ca depuis le constructeur de cB :
cout << p1->NOM;
// ou pour le même résultat , toujours dans le constructeur :
p1->print_nom();
par contre, si je fais les mêmes instructions depuis une nouvelle fonction membre de cB, j'ai des trucs assez farfelus ...
si c'est pas assez claire, je peux ballancer les sources !
cs_Beuss
Messages postés100Date d'inscriptionsamedi 27 juillet 2002StatutMembreDernière intervention11 juin 2003 27 avril 2003 à 09:48
Bon OK j'ai vu la source alors déjà premierement, il passe pas à la compil faut mettre "describe" sinon ca foire
Deuxiemement : tu pourrais pas donner des noms compréhensibles à tes classes, ca aiderait.
Troisiemement (c'est la que ca t'intéresse) : ton probleme vient du fait que tu passes tes trois classes par valeur, donc en fait ce ne sont pas les classes du main qui sont passées mais des copies de celles ci qui n'existent que dans le constructeur de Cze, pour résoudre ton probleme tu dois passer à ce constructeur des références sur des objets de la classe cSFSI, le prototype du constructeur devient donc :
cs_Beuss
Messages postés100Date d'inscriptionsamedi 27 juillet 2002StatutMembreDernière intervention11 juin 2003 27 avril 2003 à 15:34
Ben en fait comme je l'ai dit vite fait tu passais à ton constructeurs des copies des objets du main qui n'existaient qu'à l'intérieur de ce constructeur, donc les adresse des pointeurs étaient valides. mais dès la fin du constructeurs, ces copies étaient détruites, donc les pointeurs pointaient à leur adresse mais il n'y avait plus personne... donc quand tu demandais le champ je sais plus quoi de ton pointeur dans describe, vu que ce pointeur pointait n'importe ou, son champ string n'existait pas réellement et donc ca correspondait à rien.
maintenant, avec les références, c'est comme si tu passais un pointeur sur les objets du main, qui eux, existent jusqu'à la fin du programme (dans le cas présent) donc les adresses sont toujours valides même à l'extérieur du constructeur.
Voila j'espère que c'est assez clair (mais je suis pas convaincu), en tout cas retient ca : dès que tu bosses avec des champs pointeurs dans une fonction extérieure à la classe passe des références (même en règle générale, ne passe jamais une instance de classe par cvaleur, préfère toujours les références ou les références constantes) ca va plus vite et ca évite ce genre d'erreur
Vous n’avez pas trouvé la réponse que vous recherchez ?