[c++] vecteur de pointeurs vers deux types différents...

vecteur de pointeurs vers deux types différents... [c++] - Programmation

Marsh Posté le 04-01-2002 à 06:22:40    

bonjour les gens,
 
voilà, je dois faire un vecteur de pointeurs vers deux types différents.
 
Vers deux classes qui dérivent d'une même autre classe en fait.
 
Mais j'y arrive pas :(
 
 
 
donc :  
 
class A
 
class B : public A
class C : public A
 
 
vecteur de pointeurs vers des B's et des C's
 
 
Voili, si quelqu'un pouvait m'expliquer comment qu'il faut faire... :jap:

Reply

Marsh Posté le 04-01-2002 à 06:22:40   

Reply

Marsh Posté le 04-01-2002 à 08:44:32    

tu fais un vecteur de pointeurs sur A

Reply

Marsh Posté le 04-01-2002 à 08:55:13    

et selon le besoin, tu cast (conversion de type) des pointeurs quand tu veux les utiliser.
si celui que t'as récupéré est un pointeur vers un objet de type B, tu le cast par (B*), sinon (C*).

Reply

Marsh Posté le 04-01-2002 à 09:31:00    

donc, si j'ai bien compris :
 
B element_de_type_B;
C element_de_type_C;
 
 
A * vecteur = new A[max];
 
(B*) vecteur[0] = element_de_type_B;
(C*) vecteur[1] = element_de_type_C;
 
...
 
 :??:

Reply

Marsh Posté le 04-01-2002 à 09:35:46    

B element_de_type_B;  
C element_de_type_C;  
 
 
A* vecteur = new A[max];  
 
vecteur[0] = (A) element_de_type_B;  
vecteur[1] = (A) element_de_type_C;
 
ms la c pas un vecteur de pointeurs sur A que t'as, c un vecteur de A (suffit de rajouter les * aux bons endroits :D)

Reply

Marsh Posté le 04-01-2002 à 09:41:22    

et c'est où les bons endroits ? :na:  :D  
 
 
puis, y a comme une contradiction avec ce que El_Gringo a dit :sweat:  
 
C'est quoi qu'est bong pleaz :jap:  
 
 
 
 
 
je suis neuneu ! n'est-ce pas ?


---------------
oui oui
Reply

Marsh Posté le 04-01-2002 à 10:02:23    

argh, j'y arrive pas.
 
en fait, j'arrive à mettre les éléments de types B dans mon vecteur ; mais le problème, c'est que quand je veux afficher ces éléments, ils sont devenus des éléments de type A :sweat:  
 
 
Bong, je vous mets le code au cas où...
 

Code :
  1. #include <vcl.h>
  2. #include <iostream.h>
  3. #include <fstream.h>
  4. #include <iomanip.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <math.h>
  8. #define MAX 500
  9. class tevenement
  10. {
  11. short flag;
  12. string name;
  13. float time;
  14. public:
  15.       tevenement() { flag=0; name=""; time=0;}
  16.  tevenement(short drapeau, string nom, float temps) { flag=drapeau; name=nom; time=temps;}
  17.       virtual void affiche() { cout << flag << " " << name << " " << time << " ";}
  18.  ~tevenement() {}
  19.      tevenement & operator=(const tevenement &);
  20. };
  21. tevenement & tevenement::operator=(const tevenement & kablouille)   //------  =
  22. {
  23.    flag = kablouille.flag;
  24.    name = kablouille.name;
  25.    time = kablouille.time;
  26.    return *this;
  27. }
  28. class tdroit : public tevenement
  29. {
  30. string fichier;
  31. public:
  32.       tdroit() { fichier="";}
  33.  tdroit(short, string, float, string);
  34.       void affiche()
  35.       {
  36.          cout << "tdroit\n";
  37.          tevenement::affiche();
  38.          cout << fichier << endl;
  39.       }
  40.  ~tdroit() {}
  41. };
  42. class tpermission : public tevenement
  43. {
  44. float number;
  45. public:
  46.       tpermission() { number=0;}
  47.  tpermission(short, string, float, float);
  48.       void affiche()
  49.       {
  50.          cout << "tpermission\n";
  51.          tevenement::affiche();
  52.          cout << number << endl;
  53.       }
  54.  ~tpermission() {}
  55. };
  56. tdroit::tdroit(short court, string corde, float bateau, string fil) : tevenement(court, corde, bateau)
  57. {
  58. fichier = fil;
  59. }
  60. tpermission::tpermission(short court, string corde, float bateau, float barque) : tevenement(court, corde, bateau)
  61. {
  62. number = barque;
  63. }
  64. /**********************************************************************/
  65. //    fin déclaration des classes
  66. /**********************************************************************/
  67. void main()
  68. {
  69.    tevenement * vecteur = new tevenement[MAX];
  70.    tevenement crotte;
  71.    tdroit a(1,"neuneu",125.36,"brol.dat" );
  72.    tpermission b(0,"yaya",258.36,52);
  73. //   a.affiche();
  74. /*
  75.    vecteur[1] = *(&a);
  76.    vecteur[1].affiche();
  77. */
  78.    vecteur[1] = *(tdroit*) (&a);
  79.    vecteur[1].affiche();
  80.    int attend;
  81.    cin >> attend;
  82. }


---------------
oui oui
Reply

Marsh Posté le 04-01-2002 à 10:03:28    

résultat, il m'affiche :
 
 
 
1 neuneu 125.36


---------------
oui oui
Reply

Marsh Posté le 04-01-2002 à 10:05:02    

B* ptr_B;  
C* ptr_C;  
 
A* vecteur[max]; <-- la j'suis pas tres sur de ma creation de tableaux de pointeurs..
 
vecteur[0] = (A*) ptr_B;  
vecteur[1] = (A*) ptr_C;

Reply

Marsh Posté le 04-01-2002 à 10:07:17    

__Lolo__ a écrit a écrit :

B* ptr_B;  
C* ptr_C;  
 
A* vecteur[max]; <-- la j'suis pas tres sur de ma creation de tableaux de pointeurs..
 
vecteur[0] = (A*) ptr_B;  
vecteur[1] = (A*) ptr_C;  




 
 
ca va pas, parce que ca transforme le ptr_B en type A
 
et ce que je veux, c'est qu'il fasse pointer vecteur[0] vers un type B...


---------------
oui oui
Reply

Marsh Posté le 04-01-2002 à 10:07:17   

Reply

Marsh Posté le 04-01-2002 à 11:36:25    

vecteur[1] = *(tdroit*) (&a);  
c'est sense faire quoi ca??
si a est de type tdroit alors
il est de type evenement aussi
et donc
vecteur[1] = &a;
ca suffit.
 
A+
LEGREG

Reply

Marsh Posté le 04-01-2002 à 11:41:00    

t'as aussi un probleme avec les pointeurs toi..
 
tu dois definir un tableau de pointeurs
et non pas un tableau de type tevenement
 
tevenement **vecteur = new tevenement*[NMAX];
...
vecteur[1] = &a;
vecteur[1]->affiche();
 
A+
LEGREG
update: le code devrait marcher maintenant

 

[edtdd]--Message édité par legreg--[/edtdd]

Reply

Marsh Posté le 04-01-2002 à 12:54:13    

oui merci, c'est ca que j'essayais de faire, mais je savais pas comment le définir :jap:


---------------
oui oui
Reply

Marsh Posté le 04-01-2002 à 12:58:42    

argh, ca marche pas avec
 
tevenement **vecteur = new (tevenement*)[NMAX];  
 
 
 
 
J'suis finalement passé par une structure
 
struct pointeureurs
{
   tevenement * pointeurs;
};
 
 
 
puis:
 
   pointeureurs *vecteur = new pointeureurs[MAX];
   vecteur[1].pointeurs = &td;
   vecteur[1].pointeurs->affiche();


---------------
oui oui
Reply

Marsh Posté le 04-01-2002 à 13:20:56    

j'ma gourre dans le code que je t'ai  
donne:
essaie avec
new tevenement*[NMAX];
 
A+
LEGREG

Reply

Marsh Posté le 04-01-2002 à 13:33:40    

youp, ca marche comme ca.
 
 
Merci beaucoup


---------------
oui oui
Reply

Marsh Posté le 04-01-2002 à 13:34:26    

bon c'est pas encore parfait ;)
 
si tu utilises new il faut toujours
faire un delete derriere
donc avant de quitter ton programme
tu fais un  
delete []vecteur;
 
ne pas oublier le [] sinon de mauvaises
choses se passent.
 
tu n'es pas oblige d'utiliser new et delete.
en C++ comme en C tu peux allouer
des tableaux de machin sur la pile
et ils sont detruits automatiquement
en dehors du scope de ta fonction:

Code :
  1. int main() { 
  2.   tevenement *vecteur[NMAX];
  3.   vecteur[1] = &a;
  4.   vecteur[1]->affiche();
  5. }


 
attention a cette histoire de scope:
si tu veux que ton objet continue
a exister en dehors de ta fonction
il faut utiliser new et non pas
allouer sur la pile.
ici ca ne pose pas de probleme
parce que tout est declare dans le main().
 
A+
LEGREG

Reply

Marsh Posté le 04-01-2002 à 13:40:13    

re - :jap:


---------------
oui oui
Reply

Sujets relatifs:

Leave a Replay

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