[C++] faire un vector de classes héritées

faire un vector de classes héritées [C++] - C++ - Programmation

Marsh Posté le 28-06-2003 à 00:18:46    

bonjour !
 
j'ai un probleme pour créer un vector avec des classes héritées :
 

Code :
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <iostream.h>
  4. #include <vector>
  5. using namespace std;
  6. class Employe{
  7. int societe;
  8. public :
  9. int getSociete(){return societe;}
  10. void setSociete(int s){societe=s;}
  11. virtual void affiche() const = 0;
  12. };
  13. class CDD:public Employe{
  14. int service;
  15. public :
  16. int getService(){return service;}
  17. void setService(int sr){service=sr;}
  18. virtual void affiche() const {cout << "CDD " << service <<endl;}
  19. };
  20. class CDI:public Employe{
  21. int service;
  22. public :
  23. virtual void affiche() const {cout<<"CDI"<<endl;}
  24. };


 
Employe est une classe virtuelle pure
je vais donc créer des objets CDD et CDI
 
avec ces classes je voudrai créer un vecteur
pour éviter d'avoir deux vecteur (un pour CDD et un pour CDI) je voudrai en faire un grâce à la classe Employe ...  :(  
 
est-ce-que cela est possible ?
 
comment faire ensuite pour avoir accès aux fonxtions des classes héritées puisqu'à priori on ne connait pas la classe des objets du vecteur .....
 
autant de questions qui m'empêchent presque de dormir, et mon projet d'avancer  :cry:  
 
merci pour votre aide !!

Reply

Marsh Posté le 28-06-2003 à 00:18:46   

Reply

Marsh Posté le 28-06-2003 à 00:26:03    

un vector<Employe *>

Reply

Marsh Posté le 28-06-2003 à 00:37:37    

++Taz a écrit :

un vector<Employe *>


 
effectivement ca semble ok :)
 
mais pour avoir acces à affiche apres, comment il faut faire ?
 

Code :
  1. vector<Employe *>::iterator it;
  2. for(it=vect.begin() ; it!=vect.end() ; it++)
  3. &it.affiche();


 
ca donne :

Code :
  1. error C2228: left of '.affiche' must have class/struct/union type


 
bah vi, il sait pas si c un CDD ou un CDI ... et moi non plus, donc pas de dynamic_cast possible ....

Reply

Marsh Posté le 28-06-2003 à 00:56:19    

(*it)->affiche()

Reply

Marsh Posté le 28-06-2003 à 01:00:07    

bien vu !
 
il me manquait les ( ) qui changent tout !
 
merci bcp !
ca marche super  :bounce:  :bounce:  :bounce:  :bounce:  :bounce:  :bounce:  :bounce:

Reply

Marsh Posté le 29-06-2003 à 15:35:12    

erf, g encore un probleme avec ca ...
 
je voudrai que chaque fois qu'on fait un push_back() on fasse une copie de l'objet que l'on mets.
 
par exemple  
 

Code :
  1. void main(){
  2. vector<Employe *>vect;
  3. vector<Employe *>::iterator it;
  4. CDD e;
  5. e.setSociete(10);
  6. e.setService(24);
  7. vect.push_back(&e);
  8.         CDI i;
  9. i.setSociete(140);
  10. vect.push_back(&i);
  11.         // le deuxieme CDD
  12.         e.setSociete(10);
  13. e.setService(72);
  14. vect.push_back(&e);
  15. for(it=vect.begin() ; it!=vect.end() ; it++){
  16.  (*it)->affiche();
  17.         }
  18. }


 
ici on va avoir un CDD puis un CDI puis un CDD
 
le probleme c que les deux CDD sont égaux   :fou:  
 
alors y a-t-il un moyen pour dupliquer l'objet ?
(en fait ca va être dans un boucle donc il y aura plein de CDD/CDI mais je sais pas combien )
 
merci !
 


Message édité par camarchepoa le 29-06-2003 à 15:38:05
Reply

Marsh Posté le 29-06-2003 à 15:58:31    

il faut créer tes objets avec new et apres tous les effacés aec delete sinon, tu utilises constament la meme adresse....

Reply

Marsh Posté le 29-06-2003 à 16:18:20    

une fois de plus quel tallent !
 
voilà le prog complet (enfin celui de l'exemple) que l'on peut adapter :
 

Code :
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <iostream.h>
  4. #include <vector>
  5. using namespace std;
  6. class Employe{
  7. int societe;
  8. public :
  9. int getSociete(){return societe;}
  10. void setSociete(int s){societe=s;}
  11. virtual void affiche() const = 0;
  12. };
  13. class CDD:public Employe{
  14. int service;
  15. public :
  16. int getService(){return service;}
  17. void setService(int sr){service=sr;}
  18. virtual void affiche() const {cout << "CDD " << service <<endl;}
  19. };
  20. class CDI:public Employe{
  21. int service;
  22. public :
  23. virtual void affiche() const {cout<<"CDI"<<endl;}
  24. void affiche2(){cout<<"KOUKOU"<<endl;}
  25. };
  26. void main(){
  27. vector<Employe *>vect;
  28. vector<Employe *>::iterator it;
  29. CDD * e=new CDD;
  30. (*e).setSociete(10);
  31. (*e).setService(24);
  32. vect.push_back(e);
  33. CDI i;
  34. i.setSociete(140);
  35. vect.push_back(&i);
  36. e=new CDD;
  37. (*e).setSociete(123);
  38. (*e).setService(72);
  39. vect.push_back(e);
  40. cout<<"//////////// VECTOR ////////////"<<endl;
  41. for(it=vect.begin() ; it!=vect.end() ; it++){
  42.  (*it)->affiche();
  43. }
  44. getch();
  45. }


 
merci bcp ++Taz !!

Reply

Marsh Posté le 29-06-2003 à 16:32:39    

1) passe tout avec new et fais tes delete
2) les setter/getter c pas trop C++, surtout dans ton cas: mais en public ou alors fais des références.3) pour les accesseurs, un petit const ça serait bien

Reply

Sujets relatifs:

Leave a Replay

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