Dans un précédent post je vous montrais la construction d'une liste chaînée pour enregistrer des composants. Je la reporte ici :
Cela fonctionne bien. Mais ce qui m’ennuie est que pour le premier élément, je n'utilise pas la méthode "ajout" et passe par un substitut lorsque indComp vaut "0"
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 int indComp = 0; // index du composant créé class CompBase; // déclaration forward du type CompBase struct PtrComp { CompBase *ptr; // liste chaînée de CompBase PtrComp *suiv; // pointeur sur le prochain élément de la liste PtrComp *ajoutComp(CompBase *pt) { // méthode d'ajout d'un élément chaîné PtrComp *nouvComp = new PtrComp; nouvComp->ptr = pt; // enregistrement du pointeur sur le composant créé nouvComp->suiv = NULL; suiv = nouvComp; return nouvComp; } }; PtrComp *compDeb = new PtrComp; // pointeur sur le début de la liste PtrComp *compCour; // pointeur d'élément de liste class CompBase { // composant de base public: CompBase() { // constructeur if (indComp == 0) { // pour l'enregitrement du premier composant, je n'utilise pas la fonction ajout, mais ... compDeb->ptr = this; // ... comme il est déjà créé, je rempli seulement les cases compDeb->suiv = NULL; compCour = compDeb; } else { compCour = compCour->ajoutComp(this); // inscription dans la liste chaînée dès le deuxième composant } indComp++; // incrémente l'indice d'inscription dans le tableau des composants } int xx; // variable de test du composant };
J'ai modifié l'appel à la construction de la liste chaînée de la manière suivante : les modifications sont en italiques dans les codes ci-dessus et ci-après
Utilisant cette deuxième méthode, à la création du premier composant, un de ses paramètres n'est pas pris en compte. Je suppose que cela vient de la méthode d'enregistrement, mais je ne vois pas où.
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 int indComp = 0; // index du composant créé class CompBase; // déclaration forward du type CompBase struct PtrComp { // rien n'est changé dans cette structure CompBase *ptr; // liste chaînée de CompBase PtrComp *suiv; // pointeur sur le prochain élément de la liste PtrComp *ajoutComp(CompBase *pt) { // méthode d'ajout d'un élément chaîné PtrComp *nouvComp = new PtrComp; nouvComp->ptr = pt; // enregistrement du pointeur sur le composant créé nouvComp->suiv = NULL; suiv = nouvComp; return nouvComp; } }; PtrComp *compDeb; // pointeur sur le début de la liste : il n'est plus créé ici PtrComp *compCour; // pointeur d'élément de liste class CompBase { // composant de base public: CompBase() { // constructeur compCour = compCour->ajoutComp(this); // inscription dans la liste chaînée dès le premier composant if (indComp == 0) compDeb = compCour; // c'est à que je fixe la valeur de compDeb } indComp++; // incrémente l'indice d'inscription dans le tableau des composants } int xx; // variable de test du composant };
Si quelque chose vous saute aux yeux.
Merci de votre aide.
Pierre
Partager