Modifier un objet depuis un objet le contenant - C++ - Programmation
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 ?
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 :
|
Je vous mets aussi l'affichage d'une station :
Code :
|
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.
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...
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 :
|
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
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.
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.
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.
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.