Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1095 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [STL] list, push_back et ses joyeux amis... Je comprends pas tout

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[STL] list, push_back et ses joyeux amis... Je comprends pas tout

n°412306
spark
Luc ?
Posté le 01-06-2003 à 20:32:56  profilanswer
 

Bon, je me met tout doucement à la STL, et j'ai un peu de mal...
 
J'ai une classe A du style:

Code :
  1. class A
  2. {
  3.     public:
  4.         string Nom; 
  5.        
  6.         A(void);
  7.         virtual ~A();
  8. };
  9. A::A()
  10. {
  11.   Nom = "";
  12.   cout << ">Creation A().    Adresse object:" << this << " Valeur Nom:" << Nom << endl;
  13. }
  14. A::~A()
  15. {
  16.   cout << "<Destruction A(). Adresse object:" << this << " Valeur Nom:" << Nom << endl;
  17. }


Avant ca, j'ai mes includes qui vont bien:

Code :
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <list>
  4. using namespace std;


et le main suivant:

Code :
  1. int main(int argc, char *argv[])
  2. {
  3.   list<A> maListe;
  4.  
  5.   // Creation objet  
  6.   A *test = new A;
  7.   test->Nom = "Test1";
  8.    
  9.   delete test;
  10.   system("PAUSE" );
  11.   return 0;
  12. }


Et ca me donne le résultat suivant:

>Creation A().    Adresse object:0x3d3e88 Valeur Nom:
<Destruction A(). Adresse object:0x3d3e88 Valeur Nom:Test1


Jusqu'ici, rien de bien sorcier, c'est normal que tout marche bien.
J'ai bien les mêmes adresses.
Là ou je capte plus c'est que si je fais un  

Code :
  1. maListe.push_back(*test);  maListe.clear();

à la place de

Code :
  1. delete test;

, et bien ca me donne le résultat suivant:

>Creation A().    Adresse object:0x3d3e88 Valeur Nom:
<Destruction A(). Adresse object:0x3d2448 Valeur Nom:Test1


Note: je fais un maListe.clear() pour que ca s'affiche avant que le programme quitte, sinon on a pas le temps de voir le cout... En remplacant les cout par des MessageBox dans la classe A et sans le maListe.clear() dans le main(), le résultat est le même car le destructeur est appelé quand l'objet list est détruit...
 
Donc ma question est la suivante: pourquoi l'adresse de mon objet A est modifiée quand je l'ajoute à la liste ???


Message édité par spark le 01-06-2003 à 20:34:08
mood
Publicité
Posté le 01-06-2003 à 20:32:56  profilanswer
 

n°412307
spark
Luc ?
Posté le 01-06-2003 à 20:35:18  profilanswer
 

Désolé si je reponds pas pendant qq heures, je dois partir.
Merci à celui qui m'expliquera pourquoi ca fait ca, ou bien où je me trompes. :D

n°412311
Taz
bisounours-codeur
Posté le 01-06-2003 à 20:39:55  profilanswer
 

par ce que les conteneur C++ contiennent des copies! fait ton operateur de copie et tu veras. d'ailleurs tu passe toit meme un Truc et pas un Truc*
 
quel interet de passé par un new/delete
 
 
edit: et pas besoin de clear non pus


Message édité par Taz le 01-06-2003 à 20:41:24
n°412312
verdoux
And I'm still waiting
Posté le 01-06-2003 à 20:43:26  profilanswer
 

Et remet le delete sinon ça fuit :D

n°412390
spark
Luc ?
Posté le 02-06-2003 à 00:32:11  profilanswer
 

++Taz a écrit :

par ce que les conteneur C++ contiennent des copies! fait ton operateur de copie et tu veras. d'ailleurs tu passe toit meme un Truc et pas un Truc*
 
quel interet de passé par un new/delete
 
 
edit: et pas besoin de clear non pus


ok, je savais pas que c'était des copies :D Je vais voir ca...

n°412394
spark
Luc ?
Posté le 02-06-2003 à 00:41:51  profilanswer
 

Donc si j'ai bien compris, je fais un object test genre

Code :
  1. A test;
  2. test.Nom = "Test1";
  3. maListe.push_back(test);


ca me créé mon objet test normalement, et vu que c'est plus en dynamique, les constructeur et destructeurs sont appelés automatiquements.
Ensuite, en faisant un push_back(test), ca ajoute un nouvel élément test' identique à test mais à une adresse différente (forcément) et son propre destructeur (donc, derriere il doit faire un memcpy de test dans test').
Donc, j'aurai l'appel de 2 destructeurs. celui de test et test'
C'est bien comme ca que ca marche ? :)

n°412408
Taz
bisounours-codeur
Posté le 02-06-2003 à 06:55:02  profilanswer
 

toi t'as fait du C... y a pas de memcpy, y a création d'un nouvel objet avec l'opérateur de recopie synthétisé qui procède à une recopie membre à membre. achète toi un vrai bouquin de C++ avant d'attaquer STL, par ce que là, c'est assez désastreux


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [STL] list, push_back et ses joyeux amis... Je comprends pas tout

 

Sujets relatifs
[C/C++] fonction sort() avec STL[MAJ] CODAGE ISO - encodage UTF-8 dans URL.. comprends pas.
Que renvoi la commande ftp LIST à mon BufferedReader ?[PHP][php.ini]Comprends pas les lignes include_path et ... ???
Meilleur system de mailing list ?[Java-Corba] Problème de call back
Utilisation de la STLJe ne comprends pas cette erreur
comprends pas! (inputStream inside)filesize() ? comprends pas un truc
Plus de sujets relatifs à : [STL] list, push_back et ses joyeux amis... Je comprends pas tout


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR