Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3066 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Vecteurs et heritages

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Vecteurs et heritages

n°747173
doncroco
Posté le 01-06-2004 à 12:27:34  profilanswer
 

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++.

mood
Publicité
Posté le 01-06-2004 à 12:27:34  profilanswer
 

n°747287
Joel F
Real men use unique_ptr
Posté le 01-06-2004 à 13:42:51  profilanswer
 

rencadre toi sur le POLYMORPHISME et les méthodes VIRTUELLES

n°747308
doncroco
Posté le 01-06-2004 à 13:52:25  profilanswer
 

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...

n°747393
bjone
Insert booze to continue
Posté le 01-06-2004 à 14:43:14  profilanswer
 

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

n°747397
R3g
fonctionnaire certifié ITIL
Posté le 01-06-2004 à 14:45:42  profilanswer
 

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.
n°747398
doncroco
Posté le 01-06-2004 à 14:45:57  profilanswer
 

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... :'(

n°747403
R3g
fonctionnaire certifié ITIL
Posté le 01-06-2004 à 14:48:30  profilanswer
 

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.
n°747404
doncroco
Posté le 01-06-2004 à 14:48:39  profilanswer
 

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

n°747407
bjone
Insert booze to continue
Posté le 01-06-2004 à 14:49:58  profilanswer
 

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.

n°747417
doncroco
Posté le 01-06-2004 à 14:53:49  profilanswer
 

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 ;))

mood
Publicité
Posté le 01-06-2004 à 14:53:49  profilanswer
 

n°747419
R3g
fonctionnaire certifié ITIL
Posté le 01-06-2004 à 14:55:13  profilanswer
 

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.
n°747644
doncroco
Posté le 01-06-2004 à 16:48:48  profilanswer
 

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
n°747651
bjone
Insert booze to continue
Posté le 01-06-2004 à 16:56:16  profilanswer
 

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.

n°747652
R3g
fonctionnaire certifié ITIL
Posté le 01-06-2004 à 16:56:37  profilanswer
 

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.
n°747663
bjone
Insert booze to continue
Posté le 01-06-2004 à 17:00:18  profilanswer
 

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.

n°747665
doncroco
Posté le 01-06-2004 à 17:01:49  profilanswer
 

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 ?

n°747669
doncroco
Posté le 01-06-2004 à 17:03:30  profilanswer
 

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.

n°747688
blackgodde​ss
vive le troll !
Posté le 01-06-2004 à 17:13:33  profilanswer
 

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
n°747700
doncroco
Posté le 01-06-2004 à 17:18:38  profilanswer
 

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...

n°747725
bjone
Insert booze to continue
Posté le 01-06-2004 à 17:34:03  profilanswer
 

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() )

n°747729
doncroco
Posté le 01-06-2004 à 17:36:48  profilanswer
 

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

n°747744
bjone
Insert booze to continue
Posté le 01-06-2004 à 17:54:22  profilanswer
 

bin sinon le moyen tu le rajoute.

n°748004
Taz
bisounours-codeur
Posté le 01-06-2004 à 20:43:07  profilanswer
 

et le destructeur virtuel :o

n°748008
bjone
Insert booze to continue
Posté le 01-06-2004 à 20:47:08  profilanswer
 

Taz a écrit :

et le destructeur virtuel :o


 
exact  :jap:

n°748442
doncroco
Posté le 02-06-2004 à 08:55:21  profilanswer
 

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

n°748781
bjone
Insert booze to continue
Posté le 02-06-2004 à 13:25:55  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Vecteurs et heritages

 

Sujets relatifs
[PHP] Classes et Héritages ou Fusion ?Exceptions et héritages
pb à la con en math : angle entre 2 vecteursHeeeeeeeeeeeeelp - vecteurs
[Algo] 3D : 2 Vecteurs Perpendiculaire à leurs points d'aplication.[resolu] calculs sur des matrices et de vecteurs
[C] Vecteurs et fonctions[java]probleme avec les vecteurs
[Java] les vecteurs[C/C++] Boules? Collisions? Vecteurs?
Plus de sujets relatifs à : Vecteurs et heritages


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)