Vecteurs et heritages

Vecteurs et heritages - C++ - Programmation

Marsh Posté le 01-06-2004 à 12:27:34    

Bonjour a tous, j'ai un problème pour utiliser des vectors et avec une hierarchie de classes. Pour résumer, j'ai une classe mere et deux classes filles qui en dérive. Je dois mettre des objets des deux classes filles dans une collection. Je la déclare donc :  
vector<Mere*> collection.  
Ensuite, j'envoie des éléments de ce "vector" dans des fonctions du type :  
void fonction (Mere *a);
Le problème est que j'ai des méthodes et variables spécifiques à chaque classe fille auxquelles je voudrais accéder dans les fonctions...  
Comment puis-je y accéder ? Comment retrouver le type de dynamique des variables des fonctions ? (type_info ?)
Si quelqu'un peut m'aider ce serait bien sympa ! J'arrive pas à vraiment trouver ce que je cherche sur le net... Quelques précisions, je développe sous linux, sans IDE, j'ai des bases de c et java et je débute le c++.

Reply

Marsh Posté le 01-06-2004 à 12:27:34   

Reply

Marsh Posté le 01-06-2004 à 13:42:51    

rencadre toi sur le POLYMORPHISME et les méthodes VIRTUELLES

Reply

Marsh Posté le 01-06-2004 à 13:52:25    

Merci pour l'orientation de recherche, mais mon problème est que je n'ai pas les méthodes auxquelles je veux accéder dans la classe mère, donc je ne peux pas les y déclarer virtuelles...

Reply

Marsh Posté le 01-06-2004 à 14:43:14    

bah reinterpret_cast<> ? :D
de toutes façon ça semble être la mauvaise approche :/

Reply

Marsh Posté le 01-06-2004 à 14:45:42    

et tu peux pas plutot avoir des fonctions void fonction (Fille1 *a) et void fonction (Fille2 *a) ?


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 01-06-2004 à 14:45:57    

en koi est-ce que c'est une mauvaise approche... dites moi que je ne m'embarque pas dans des trucs s'il faut que je revoie ma conception... :'(

Reply

Marsh Posté le 01-06-2004 à 14:48:30    

doncroco a écrit :

en koi est-ce que c'est une mauvaise approche... dites moi que je ne m'embarque pas dans des trucs s'il faut que je revoie ma conception... :'(

C'est une mauvaise approche si tu as besoin de connaitre le type de ton objet pour décider quelle méthode appeler. Ca devrait se faire tout seul, soit au runtime, soit à la compilation.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 01-06-2004 à 14:48:39    

Oui pour les deux fonctions séparée mais le traitement à une toute petite différence prêt serait le même...

Reply

Marsh Posté le 01-06-2004 à 14:49:58    

bah ché pas tu as l'air de vouloir tester dans une fonction le type d'un objet.
c'est ptet pas bon...
 
et n'oublies pas qu'avec le vector<Mere *>, quand le vector sera détruit, tes instances de Mere de ta collection ne le seront pas.

Reply

Marsh Posté le 01-06-2004 à 14:53:49    

Alors, en fait, il ne peut pas y avoir (à l'execution tout du moins) d'instances de Mere. Mais bon, je crois que je v revoir ma conception... petite question hors topic, est-ce que vous ne trouvez pas que le c++ est légérement plus chiant à coder que le java... (je me lance dans un sujet sensible, je sais... mais ca me rassurerait de savoir que je ne suis pas le seul à penser ça ;))

Reply

Marsh Posté le 01-06-2004 à 14:53:49   

Reply

Marsh Posté le 01-06-2004 à 14:55:13    

doncroco a écrit :

Alors, en fait, il ne peut pas y avoir (à l'execution tout du moins) d'instances de Mere. Mais bon, je crois que je v revoir ma conception... petite question hors topic, est-ce que vous ne trouvez pas que le c++ est légérement plus chiant à coder que le java... (je me lance dans un sujet sensible, je sais... mais ca me rassurerait de savoir que je ne suis pas le seul à penser ça ;))

Tu n'es pas le seul ;) Mais un codeur C++ qui passe au java pense la même chose. C'est une question d'approche différente.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 01-06-2004 à 16:48:48    

juste une petite question encore, si je fais un trux du style :

Code :
  1. void fonction(Mere *obj){//traitement}
  2. int main(void){
  3. Fille objFille;
  4. fonction (&objFille);
  5. }


Alors dans ma fonction, objFille est devenu un objet de la classe Mere*, c'est ca ? Je n'ai plus aucun moyen d'y accéder en tant que fille ? C'est ca ?


Message édité par doncroco le 01-06-2004 à 16:50:03
Reply

Marsh Posté le 01-06-2004 à 16:56:16    

Fille est casté vers la mere.
si Fille dérive de Mere c'est bon.
 
et fonction() voit une Mere.
 
dans fonction(), tu peux caster Mere en Fille, mais pris comme ça -rien- ne peut te garantir que tu peux caster une Mere en Fille.
 
si tu as dérivé une autre classe Fille2 de Mere, et que tu passes pas donc une Fille2 à fonction(), fonction va récupérer une Mere qu'il castera en Fille, et boum dans le mur un peu plus loin.
 
le problème c'est qu'une fois dans fonction(), tu as une Mere, rien ne te garanti que tu peux la faire passer pour une Fille.

Reply

Marsh Posté le 01-06-2004 à 16:56:37    

doncroco a écrit :

juste une petite question encore, si je fais un trux du style :

Code :
  1. void fonction(Mere *obj){//traitement}
  2. int main(void){
  3. Fille objFille;
  4. fonction (&objFille);
  5. }


Alors dans ma fonction, objFille est devenu un objet de la classe Mere*, c'est ca ? Je n'ai plus aucun moyen d'y accéder en tant que fille ? C'est ca ?

Ben tu peux toujours caster, mais c'est sale : ta fonction déclare prendre des paramètres de type Mere *, elle doit donc les traiter en tant que tels. Si tu veux faire un traitement spécifique à Fille, fais-le dans une méthode qui prend une Fille en paramètre.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 01-06-2004 à 17:00:18    

plus précisément,  "fonction()" qui fait un traitement, devrait être une méthode membre de ta classe Mere.
et tu fais une version pour la classe Mere et Fille.
et si tu veux pouvoir apeller la version de Fille, via un Mere*, il faut que ta méthode "fontion()" soit virtuelle dans Mere.

Reply

Marsh Posté le 01-06-2004 à 17:01:49    

Donc je fait deux fonctions, une  

Code :
  1. void fonction(Fille1 obj){//traitement1}


l'autre

Code :
  1. void fonction(Fille2 obj){//traitement2}


mais si ces objets sont stockés dans un vector<Mere> maman et que je fais un appel :  

Code :
  1. fonction(maman[i]);


... là ca va pas marcher... si ?

Reply

Marsh Posté le 01-06-2004 à 17:03:30    

désolé bjone, j'avais pas vu ton post, le problème c'est que ces fonctions comme expliqué juste au dessus font partie d'un algo qui traite les objets... pas des objets eux-même.

Reply

Marsh Posté le 01-06-2004 à 17:13:33    

tu peux peut-être utiliser mere en temps qu'interface :
 

Code :
  1. struct mere
  2. {
  3.   // ....
  4.   virtual void fonction() {}
  5.   virtual ~mere() {}
  6. };
  7. struct fille1 : public mere
  8. {
  9.   // ....
  10.   void fonction() { /* traitement 1 */ }
  11. }
  12. struct fille2 : public mere
  13. {
  14.   // ....
  15.   void fonction() { /* traitement 2 */ }
  16. }


 
ensuite, sur les items de ton std::vector<mere*> tu peux appeler fonction()
 
edit : le destructeur virtuel


Message édité par blackgoddess le 02-06-2004 à 09:58:53
Reply

Marsh Posté le 01-06-2004 à 17:18:38    

en fait c pas possible car ma "fonction" est complètement détachée de la représentation des classes car elle contient pas mal de paramètres... ou alors, faut absolument que je change toute mon implémentation pour la rendre un peu plus objet :( ... mais si c'est la seule solution...

Reply

Marsh Posté le 01-06-2004 à 17:34:03    

bah dans fonction(), si tu fais un cast forcé d'une Mere en Fille, quand tu le fais, est-ce qu'il y a un moyen d'être SÛR que c'est faisable ? (ie un flag/attribut visible à travers Mere, un attribut passé en paramètre à fonction() )

Reply

Marsh Posté le 01-06-2004 à 17:36:48    

nan, aucun moyen, c bien pour ca que je suis encore de vous emmerder à vous poser des questions qui peuvent, j'en suis sûr vous paraitre un peu con parfois :D

Reply

Marsh Posté le 01-06-2004 à 17:54:22    

bin sinon le moyen tu le rajoute.

Reply

Marsh Posté le 01-06-2004 à 20:43:07    

et le destructeur virtuel :o

Reply

Marsh Posté le 01-06-2004 à 20:47:08    

Taz a écrit :

et le destructeur virtuel :o


 
exact  :jap:

Reply

Marsh Posté le 02-06-2004 à 08:55:21    

qu'est-ce donc que cela est exactement ? ;) Et comment m'en servir ?

Reply

Marsh Posté le 02-06-2004 à 13:25:55    

en fait c'est simple:
 
mettons un:
 
class Mere
{
public:
  ~Mere(); // destructeur de Mere
};
 
class Fille : public Mere
{
public:
  ~Fille(); // destructeur de Fille
};
 
mettons à un moment tu as:
 
Fille *TaSoeur=new Fille();
 
un peu plus loin tu te retrouves avec quelque chose comme:
 
Mere *TaMere=TaSoeur;  
 
et puis à un moment:
 
delete TaMere;
 
TaMere pointe comme TaSoeur sur une instance de Fille.
Mais comme l'instance est détruite à travers un pointeur sur "Mere", c'est le destructeur de Mere qui sera appellé, et non le destructeur de Fille. (et donc kaput la destruction des objets de Fille, seuls les objets de Mere passent).
 
Pour remédier à cela, il faut que le destructeur soit virtuel dans Mere, du style:
 
class Mere
{
public:
   virtual ~Mere();
};
 
Comme ça, si tu crées plein de classes dérivées de Mere, Fille1,Fille2,Fils,Oncle, en détruisant à travers un pointeur sur Mere, le destructeur de la classe dérivée sera bien appellé.
 
dsl si j'ai glissé :D

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed