Bonjour,
J'ai plusieurs classes qui s'intitulent ainsi :
ECBEntity, ECBArmee, ECEntity, ECArmee.
ECBArmee est dérivée de ECBEntity. Toutes deux contiennent surtout l'interface, sachant que ECBArmee n'est *pas* abstraite et a du code.
ECEntity est dérivée de ECBEntity et reste abstraite, avec des variables et un peu de code en plus.
Enfin, ECArmee est censée etre dérivée de ECEntity et de ECBArmee, pour garder ce qui a été mis donc dans ECBArmee mais pour avoir les elements en plus de ECEntity.
Alors je ne sais pas si je suis très clair.
Je ne sais pas comment gérer avec les ": public virtual" ou "public", et pour le moment j'ai ceci :
Le problème, c'est que lors de l'instantiation d'une classe ECArmee, ben ça bug un rien :
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 class ECBEntity { public: ECBEntity() {} ECBEntity(const Entity_ID _name, ECBPlayer* _owner, ECBCase* _case, e_type type); virtual ~ECBEntity() {} /*...*/ }; /* Note: Implémentation des classes virtuelles pures de ECBEntity */ class ECBArmee : public virtual ECBEntity { public: ECBArmee(const Entity_ID _name, ECBPlayer* _owner, ECBCase* _case, uint _nb) : ECBEntity(_name, _owner, _case, E_ARMEE), nb(_nb) {} /*...*/ }; /* Note: ECEntity n'implémente pas les fonctions virtuelles pures de ECBEntity et donc reste une classe abstraite */ class ECEntity : public virtual ECBEntity { public: ECEntity(const Entity_ID _name, ECBPlayer* _owner, ECBCase* _case, e_type _type) : ECBEntity(_name, _owner, _case, _type) {} virtual ~ECEntity() {} /*...*/ }; /* Est donc basée sur ECBArmee et ECEntity */ class ECArmee : public ECBArmee, public ECEntity { public: ECArmee(const Entity_ID _name, ECBPlayer* _owner, ECase* _case, uint _nb) : ECBArmee(_name, _owner, _case, _nb), ECEntity(_name, _owner, _case, E_ARMEE) {} };
e_name est placée dans ID de armee, et ça imprime cela par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 const char *e_name = Sender->Channel()->FindEntityName((*cai)->Country()->Owner() ? dynamic_cast<ECPlayer*>((*cai)->Country()->Owner()->Player()) : 0); printf("nia %s\n", e_name); ECArmee *armee = new ECArmee(e_name, (*cai)->Country()->Owner() ? (*cai)->Country()->Owner()->Player() : 0, *cai, sender->Channel()->Map()->NbSoldats()); printf("nia %s\n", armee->ID());
ounia AA
nia
En outre, ça plante un peu plus loins lors d'appels à des membres de la classe.nia AA
nia ô£ ü³ Ž
µ ¹
Alors il semblerait qu'il y a un tout petit problème et je ne sais pas trop quoi faire.
Alors je vous remercie si vous pouviez résoudre ce facheux problème.
Progs.
P.S.: Comme vous pouvez le voir, je dois appeler un constructeur dans ECArmee pour chaques classes mères, et c'est ennuyeux car ECBArmee::ECBArmee() appel ECBEntity::ECBEntity() qui fait un peu la meme chose que ECEntity::ECEntity(). Le soucis c'est que si j'appel un constructeur de ECBArmee() vide, et ben je n'ai pas accès à la variable, protected pourtant, intitulée "nb" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ECArmee(const Entity_ID _name, ECBPlayer* _owner, ECase* _case, uint _nb) : /*ECBArmee(_name, _owner, _case, _nb), */ECEntity(_name, _owner, _case, E_ARMEE), nb(_nb) {}Edit: Note que si je mets "nb = _nb" dans le corps du constructeur plutot que dans la liste d'initialisatino ça marche... pourquoi ? Bien sur mettre le code ci-dessus dans le constructeur n'arrange rien.Units.h: In constructor 'ECArmee::ECArmee(const char*, ECBPlayer*, ECase*, uint)':
Units.h:32: erreur: class 'ECArmee' does not have any field named 'nb'
Partager