URGENT : Classes, Pointeurs, et fonctions membres !!

guiguimac Messages postés 85 Date d'inscription mercredi 29 août 2001 Statut Membre Dernière intervention 22 avril 2006 - 26 avril 2003 à 22:51
guiguimac Messages postés 85 Date d'inscription mercredi 29 août 2001 Statut Membre Dernière intervention 22 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 !

merci d'avance à tous !!

guiguimac

5 réponses

cs_Beuss Messages postés 100 Date d'inscription samedi 27 juillet 2002 Statut Membre Dernière intervention 11 juin 2003
27 avril 2003 à 09:38
bah balance les sources alors :big)
0
cs_Beuss Messages postés 100 Date d'inscription samedi 27 juillet 2002 Statut Membre Dernière intervention 11 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 :

cZE( cSFSI& VIVANTS, cSFSI& MORTS, cSFSI& HIBERNES);

et le constructeur (il change pas) :

cZE::cZE(cSFSI &VIVANTS, cSFSI &MORTS, cSFSI &HIBERNES)
{
pVIVANTS = &VIVANTS;
pMORTS = &MORTS;
pHIBERNES = &HIBERNES;

// dans le constructeur,
cout << "affichage depuis le constructeur de cZE : " << endl;
cout << pVIVANTS->Name << endl;
pVIVANTS->aprint_name();

}

voila c'est tout, bonne journée et arrete les noms style cZE et cSFSI...
0
guiguimac Messages postés 85 Date d'inscription mercredi 29 août 2001 Statut Membre Dernière intervention 22 avril 2006
27 avril 2003 à 15:12
ca marche nickel !
merci bcp !

pour les nom en fait :
ZE = Zone d'Echange
SFSI = syst de fichier sequentiel indexé
... donc c'est parlant juste pour ceux de ma promo ... désolé.

je crois que j'avais bien fait n'importe quoi ... avec les &

est-ce que tu peux expliquer ce qu'il se passait à l'exe pour que depuis le constructeur ca passe, mas pas depuis la fonction membre ?

bonne fin de WE et encore merci !
0
cs_Beuss Messages postés 100 Date d'inscription samedi 27 juillet 2002 Statut Membre Dernière intervention 11 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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
guiguimac Messages postés 85 Date d'inscription mercredi 29 août 2001 Statut Membre Dernière intervention 22 avril 2006
27 avril 2003 à 15:36
Merci bcp !
0
Rejoignez-nous