Bonjour,
Voilà, je m'excuse d'avance car le post risque d'être assez long, mon problème portant sur une implémentation objet assez conséquente.
Je suis actuellement avec un ami en train de développer une version pc du jeu de plateau HeroQuest, en utilisant le C++ et la librarie graphique Allegro - je le précise, même si dans le cas présent on s'en moque un peu vous verrez -. Et nous rencontrons un problème au niveau de la destruction de notre objet plateau.
C'est là que je dois m'expliquer. Je vous passe les méthodes à chaque fois, mais voici à quoi ressemblent nos classes :
Au moment de la destruction du plateau, nous devons détruire un très grand nombre d'objets (494 cases, 34 salles, et tout les contenus), et il semblerait que nous nous emmelions un peu les pinceaux.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67 class p_plateau { protected : std::string nom_quete; // Nom de la quête std::string description_quete; // Description de la quete int type_quete; // 0 CHASSER / 1 SAUVER u_liste * cibles; // La liste - chainée - des cibles // de la quête p_salle * salles[34]; // Le tableau des salles du plateau. p_case * matrice_plateau[26][19];// La matrice des cases BITMAP * buffer_plateau; // Le BITMAP * dans lequel on dessine } class p_salle { protected : std::string adresse_texture; // L'adresse de la texture des // cases de la salle. int nb_cases; // Nombre de case p_case ** cases; // Tableau des cases de la salle u_liste * contenu; // La liste - chainée - des positionnables BITMAP * texture; // Le BITMAP * de la texture }; class p_case : public u_point { protected : int visible; // 0 Invisible - 1 Visible int bordure[4]; // Les propriétés des bords de la case // (0 rien/1 mur /2 porte/..) p_salle ** salles; // Tableaux des salles auxquelles // appartient la case u_liste * contenu; // La liste - chainée - des positionnables BITMAP * buffer; // Le BITMAP * dans lequel on dessine }; /* Exemple de positionnables : un gobelin, un héro, un piège hérissé de lance, un chevalet de torture, un sarcophage, bref n'importe quoi qui se pose sur le plateau. */ class u_point { protected : int x; int y; }; /* Deux classes pour la création et la gestion de listes chainées d'élément de tous poils. */ class u_liste { protected : u_noeud * tete; u_noeud * courant; int nb_elements; }; class u_noeud { protected : void * valeur; u_noeud * suivant; };
Pour éviter toute tentative de destruction sur des objets déjà disparus, nous prenons pourtant soin, dans le destructeur de salle de passer à null le pointeur de chaque noeud de contenu et dans le destructeur de plateau d'en faire autant avec la liste des cibles. Ainsi tous les différents contenu ne sont plus connus qu'une fois, au travers du contenu des salles.
Voici le code des différents destructeurs :
Voilà, merci d'avoir eu le courage de lire tout ceci, et merci d'avance à tout ceux pourrait nous apporter leur aide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89 ~plateau() { int i, j; // Mise à NULL de tous les pointeur vers les objets cibles. if(cibles->get_tete()!=NULL) { cibles->init(); while(cibles->is_suivant()) { cibles->get_courant()->set_valeur(NULL); cibles->go_suivant(); } } delete cibles; // Destruction des cases du plateau for(i=0;i<26;i++) { for(j=0;j<19;j++) { delete matrice_plateau[i][j]; } } delete matrice_plateau; // Destruction des salles for(i=0;i<34;i++) { delete salles[i]; } delete salles; // Destruction du BITMAP * où dessiner le plateau destroy_bitmap(buffer_plateau); } ~p_salle() { // Mise à NULL de tous les pointeur vers les objets contenu dans la salle if(contenu->get_tete()!=NULL) { contenu->init(); while(contenu->is_suivant()) { contenu->get_courant()->set_valeur(NULL); contenu->go_suivant(); } } delete contenu; // Destruction du tableau de cases delete cases; // Destruction de la texture en mémoire destroy_bitmap(texture); } ~p_case() { // Destruction du tableau de salles delete salles; // Destruction du contenu // - cette fois les pointeur on concervés leur valeur - delete contenu; destroy_bitmap(buffer); } ~u_liste() { int i; u_noeud * parcours=tete, * suivant; // Par cours de la liste et destruction de chacun de ses noeuds. for(i=0;i<nb_elements;i++) { suivant=parcours->get_suivant(); delete parcours; parcours=suivant; } } ~u_noeud() { // Destruction de l'objet porté par le noeud delete valeur; }
Parce que la solution pour que ca tourne pour le moment, c'est de commenter intégralement le destructeur de plateau :=°
Partager