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 : 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
};
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 : 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
};
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