Modélisation, classes imbriquées [Résolu]

Signaler
Messages postés
146
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016
-
Messages postés
146
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016
-
Certains non-dits vont sans dire.

5 réponses

Messages postés
146
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016

Désolé, seule ma signature a été envoyée, ça m'arrive souvent...
Depuis, J'AI TROUVÉ LA SOLUTION.

Pour ne pas trop pourrir le forum, je formule quand même ma question originale:

J'ai une classe TPlusieursQqc qui contient un tableau rempli d'instances de la classes TQqc.
Pour le constructeur de TPlusieursQqc, j'aimerais faire appel au constructeur de TQqc, ce qui paraît logique, et pareil pour le déstructeur.

Là où je me trompais, c'était dans l'appel au constructeur de TQqc

--------------------------------------------------------------
constructor TPlusieursQqc.Create(NbQqc: word);
var i: word;
begin
SetLength(TableauQqc, NbQqc); // TableauQqc, membre de TPlusieursQqc, array of TQqc
for i := 0 to NbQqc-1 do
TableauQqc[i].Create(); // appel au constructeur de TQqc
end;
--------------------------------------------------------------

A la place de l'avant dernière ligne, j'avait écrit:
TableauQqc[i].TQqc.Create();
C'est cette petite confusion qui provoquait l'erreur. Désolé, je débute...
Messages postés
146
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016

J'ai finalement employé une autre technique : je passe le tableau Tableau de la classe TA en argument aux méthodes membres de TB qui en ont besoin. Comme ce tableau est déclaré dynamiquement, seule son adresse est transmise. Ainsi, l'exécution ne devrait pas en pâtir.

Cordialement,
Messages postés
814
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
30 juillet 2009
3
salut,

t'es sur que ça marche ton histoire?

cela ne serait pas plustot:

TableauQqc[i] := TQqc.Create();

a+

Loda
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.
Messages postés
146
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016

Oui, biensûr.

J'ai corrigé cette faute dès la compilation. J'ai pas encore l'habitude.

Merci de m'avoir corrigé.
Messages postés
146
Date d'inscription
jeudi 22 novembre 2007
Statut
Membre
Dernière intervention
21 mars 2016

J'ai un souci pour modéliser deux classes dont chacune d'entre elle contient une instance (enfin son adresse uniquement) de la deuxième classe. Je m'explique par un petit schéma ascii.

 __________________
|        TA        |
+------------------+
| Tableau:         |
|   array of Word  |
| ...              |     _________________
| PremierB: TB ----+--> |       TB        |
|__________________|    +-----------------+
           /'\          | ...             |     _________________
            |           | ProchainB: TB --+--> |       TB        |
            +-----------+ MonA: TA        |    +-----------------+
            |           |_________________|    | ...             |
            |                                  | ProchainB: TB --+--> nil
            +----------------------------------+ MonA: TA        |
                                               |_________________|

Le problème est que la première classe déclarée empêche la compilation, puisqu'elle ne connait pas encore le type de la deuxième.

Vous vous demandez peut-être pourquoi j'ai besoin de faire ça ? Et bien la classe TA doit contenir la tête de la liste chaînée d'objets de classe TB. Par ailleurs, les objets de classe TB doivent connaître les valeurs du tableau Tableau de TA. Je pourrais alors simplement déclarer l'attribut Tableau de TA en public, mais avant de me résigner à cette facilité, je serais curieux de savoir si mon modèle est réalisable.

La déclaration de mes types se présente comme suit.

TB = class
private
  ...
  ProchainB: TB;
  MonA: TA; // ça ne marche pas car TA n'est pas encore déclaré
public
  ...
end;

TA = class
private
  Tableau: array of Word;
  ...
  PremierB: TB; // ça marche car TB est déclaré avant
public
  ...
end;

Si j'intervertis les déclarations de mes classes TA et TB, le problème sera le même.

Cordialement,