problème avec les listes chaînées : suite
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 :
Code:
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
}; |
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"
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
Code:
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
}; |
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ù.
Si quelque chose vous saute aux yeux.
Merci de votre aide.
Pierre