Modifier un objet depuis un objet le contenant

Modifier un objet depuis un objet le contenant - C++ - Programmation

Marsh Posté le 23-03-2011 à 16:52:10    

Salut à tous ,  
 
Voici la hiérarchie : Atelier contient Stations ( une liste ) , liste contient un pointeur vers un Conteneur et un Operateur. L'affichage d'atelier se fait en parcourant chaque station et demandant a chacune de s'afficher, l'affichage de station affiche l'id du conteneur et de l'opérateur, ou "vide" si les pointeurs sont null.
 
Problématique : J'aimerai pouvoir affecter des conteneurs et opérateur a une station depuis atelier.
 

Code :
  1. bool Atelier::affecterConteneurEtOperateurAStation(Conteneur&  c , Operateur& o , Station& s)
  2. {
  3.     // on déplace le conteneur
  4.     this->addConteneur(c , s) ;
  5.     this->ze->freeConteneur(c) ;
  6.     // on déplace l'operateur
  7.     this->addOperateur(o , s) ;
  8.     this->zr->freeOperateur(o) ;
  9.     return true ;
  10. }


 
Je vais mettre uniquement les code lié a l'ajout d'un conteneur , car le probleme est sans doute lememe pour les deux objets, et le free marche.
 

Code :
  1. bool Atelier::addConteneur(Conteneur& c , Station& s)
  2. {
  3.     list<Station>::iterator it = this->stations.begin() ;
  4.     for(it ; it!= this->stations.end() ; it++ )
  5.     {
  6.         if(it->id == s.id)
  7.         {
  8.             return s.addConteneur(c);
  9.         }
  10.     }
  11.     return false ;
  12. }


 

Code :
  1. bool Station::addConteneur(Conteneur& c)
  2. {
  3.     if (this->conteneurCourant == NULL)
  4.     {
  5.         this->conteneurCourant = &c ;
  6.         return true ;
  7.     }
  8.     return false ;
  9. }


 
Bon, a priori rien de bien compliqué, et pourant quand je demande a la fin de tout cela , depuis le main, de m'afficher le contenu de l'atelier, il parcours chaque station et verifie que leur pointeur ne soient pas null pour m'afficher leur conteneurs/Operateurs . Et il me dit "Vide", considerant que ma station conserve ses pointeurs a null. Je comprends pas.
 
j'ai voulu débuggé :
A la fin de la méthode Atelier::affecterConteneurEtOperateurAStation
On a bien la station a l'@0x28fe7c qui passe son pointeur de conteneur de 0x0 à 0x28fe08.
(dans les deux méthodes par lesquelles elle passe, l'@ de la station reste la même) .
 
Quand on revient dans le main, la station passée en paramètre affecterConteneurEtOperateurAStation(....) a pour pointeur sur conteneur 0x28fe08 et malgré tout , le test != NULL reste false a l'affichage.
 
Je ne trouve pas de solutions.Dites moi si vous oui
 
Merci encore.

Reply

Marsh Posté le 23-03-2011 à 16:52:10   

Reply

Marsh Posté le 23-03-2011 à 17:23:59    

Une petite remarque pour réduire un peu (et optimiser !) le code : plutôt que d'utiliser une liste pour stocker les stations, pourquoi ne pas utiliser une map, indexée sur l'id de la station ?
 
La recherche d'une station particulière serait ainsi plus rapide.
 
Sinon, que font exactement tes fonctions freeConteneur et freeOperateur ?
Peux-tu aussi poster le code de ton main ? Si le déboguage semble indiquer que tout est OK, c'est peut-être juste un bug d'affichage ?

Reply

Marsh Posté le 23-03-2011 à 17:37:09    

Pour la map , j'y penserai , l'important etant tout d'abord que cela fonctionne :)
 
Voici le main :  

Code :
  1. // Qualifications :
  2.     Qualification q1(1,10) ;
  3.     Qualification q2(2 , 20) ;
  4.     // Operateurs :
  5.     Operateur op1(1) ;
  6.     Operateur op2(2) ;
  7.         // remplissage
  8.         op1.qualifications.push_back(q1);
  9.         op2.qualifications.push_back(q2);
  10.     // Station
  11.     Station st1(1) ;
  12.         st1.qualifications.push_front(q1) ;
  13.     Station st2(2) ;
  14.         st2.qualifications.push_front(q2) ;
  15.     // Conteneur
  16.     Conteneur c1(1 ,28) ;
  17.         c1.ajouterQualification(q1) ;
  18.         c1.calculerPriorite() ;
  19.     Conteneur c2(2 ,30 ) ;
  20.         c2.ajouterQualification(q2) ;
  21.         c2.calculerPriorite() ;
  22.     //PLACER DANS ZONES :
  23.         // Zone entree
  24.         ZoneEntree zoneEntree ;
  25.         zoneEntree.addConteneur(c1) ;
  26.         zoneEntree.addConteneur(c2) ;
  27.         // Zone Stockage
  28.         ZoneStockage zoneStockage ;
  29.         // Zone Repos
  30.         ZoneRepos zoneRepos  ;
  31.         zoneRepos.addOperateur(op1) ;
  32.         zoneRepos.addOperateur(op2) ;
  33.         // Atelier
  34.         list<Station> stationsAtelier ;
  35.         stationsAtelier.push_back(st1) ; stationsAtelier.push_back(st2) ;
  36.     // Affichage des zones
  37.     zoneEntree.affichageTotal() ; cout <<endl;
  38.     zoneRepos.affichageTotal() ; cout <<endl;
  39.     zoneStockage.affichageTotal() ;
  40.     // Atelier
  41.     Atelier atelier(&zoneRepos , &zoneEntree  , &zoneStockage , stationsAtelier) ;
  42.     // TEST AFFECTATION
  43.     atelier.affichageTotal() ;  cout <<endl;
  44.     atelier.affecterConteneurEtOperateurAStation(c1 , op1  , st1) ;
  45.     cout <<" Apres affectation" <<endl;
  46.     atelier.affichageTotal() ;


 
Je vous mets aussi l'affichage d'une station :  
 

Code :
  1. // Affiche l'operateur et le conteneur de la station
  2. void Station::affichageTotal()
  3. {
  4.         cout << "Station " << this->id << " : "<< endl ;
  5.         if (this->operateurCourant != NULL ){this->operateurCourant->affichageTotal() ;}
  6.         if (this->conteneurCourant != NULL ){this->conteneurCourant->affichageTotal() ;}
  7.         if ((this->conteneurCourant == NULL ) && (this->operateurCourant == NULL ) )
  8.         {cout << " Vide" ;} cout << endl;
  9. }


 
Concernant free, il libere la structure d'un de ses objets : operateur ou conteneur selon la zone qui les contient) , mais cela importe peu vu que le free agit sur un autre objet ( une zone ) et que le problème est dans l'atelier. :)  
 
 
Concernant ce qui se passe au niveau de la console :  
 
Zone Entree :
Conteneur 1 : de prio2.8
Conteneur 2 : de prio1.5
 
Zone Repos :
Operateur : 1
Operateur : 2
 
Zone Stockage :
 Vide
Atelier :
Station 1 :
 Vide
Station 2 :
 Vide
 Apres affectation
Atelier :
Station 1 :
 Vide
Station 2 :
 Vide
 
 
----------------
 
Ce qui devrai y a voir dans l'atelier : Station 1 : operateur 1 et conteneur 1  qui ont étés déplacés de leur zone ( ça ça fonctionne) mais pas replacé dans l'atelier.  
 
S'il te faut autre chose hésite pas.
 
 

Reply

Marsh Posté le 23-03-2011 à 18:01:37    

Je reviens d'ici une petite heure , a desuite

Reply

Marsh Posté le 23-03-2011 à 20:59:42    

Peux-tu poster le code de la fonction "affichageTotal" de la classe Atelier ?
 
Pour l'instant, je sèche...

Reply

Marsh Posté le 23-03-2011 à 21:14:18    

Bon, j'ai plus ou moins trouvé ce qui allait pas et ca ne me rassure pas !  
 

Code :
  1. bool Atelier::addConteneur(Conteneur& c , Station& s)
  2. {
  3.     list<Station>::iterator it = this->stations.begin() ;
  4.     for(it ; it!= this->stations.end() ; it++ )
  5.     {
  6.         if(it->id == s.id)
  7.         {
  8.             return it->addConteneur(c);
  9.         }
  10.     }
  11.     return false ;
  12. }


 
Quand je mettais s.addConteneur(c);, il ne modifier pas la station de l'atelier , là en revanche oui.  
Ce qui est etrange,  c'est que donc, la station de l'atelier et la station qui a été mise dans l'atelier sont totallement indépendante.  
 
Je creer une station, je lui done l'id 1  ,je la met dans l'atelier, je lui demande l'id il me répond 1  
et si je modifie la station sans passer par l'atelier, il ne met pas a jour la variable de l'atelier c'est normal ?  
Ca veut dire que les push_front et push_back sont fait par copie ???  
 
Merci d'avance  


Message édité par Knarf64 le 24-03-2011 à 00:04:29
Reply

Marsh Posté le 24-03-2011 à 08:04:42    

Tous les conteneurs de la STL fonctionnent avec des copies des objets. Effectivement, je n'avais pas fait attention à la manière dont tes listes étaient déclarées.
Si tu veux que les objets qu'elles stockent soient réellement partagés, il faut simplement y stocker un pointeur sur ces objets. Ainsi, il n'y a que le pointeur qui est copié, mais l'objet référencé reste bien le même.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed