destructeur de list ????

destructeur de list ???? - C++ - Programmation

Marsh Posté le 22-06-2003 à 12:31:17    

voilou je viens de regarder un peu partout et j'ai trouvé http://www-ic2.univ-lemans.fr/~del [...] sld005.htm
c'est exatement ce que je veux faire un conteneur d'objet hétérogéne sur une même classe de base commune (héritage)  
 
grhhh y a pas d'exemple sur ce site pour m'expliquer et j'ai pas trouvé gd chose sur google. les tuto portent tjrs sur des int, float ...  :kaola:  
 
 
dans mon main j'ai essayé ca avec t(barre_plate hérite de carré):

Code :
  1. main ()
  2. {
  3. vector<carre> t;
  4. t.push_back(new barre_plate (0.5,0.4,3,'v'));
  5. }


 
et j'obtiens ca comme erreur  
Error:  main.cpp(130,48):Cannot initialize 'const carre &' with 'barre_plate * volatile'
Error:  main.cpp(130,48):Type mismatch in parameter 'x' in call to 'std::vector<carre>::push_back(const carre & )'
 
 
je vois pas ou j'ai mis un const ms bon  
 
et j'ai essayé avec *t
 

Code :
  1. main ()
  2. {
  3. vector<carre> *t;
  4. t.push_back(new barre_plate (0.5,0.4,3,'v'));
  5. }


 
et j'obtiens comme erreur
Error:  main.cpp(130,16):Structure required on left side of . or .*
 
je m'y connais pas trop justement ds les pointeurs ms normallement un new comme malloc fournie un espace memoire et renvoie l'adresse du permier élément de l'objet. Donc je ne sais pas trop comment cela se passe, lorsque l'on met un push_back qui n'attends pas une adresse normallement.
 
le constructeur barre_plate fonctionne bien ..
je n'ai pas de fonction virtuel pour le moment.
 
voici les prototypes  si ca peut aider :
 

Code :
  1. class baton
  2. {
  3. private :
  4.       char orientation;
  5.       //std :: list<baton>  coord;
  6.    protected :
  7.     float pas;
  8.       float x, y;
  9.       list<float>  coordx, coordy;
  10. public :
  11.       //constructeur  d'initialisation x,y et le pas
  12.       baton (float = 1.1, float = -10);
  13.       //destructeur
  14.       ~baton ();
  15.       void chg_pas (float const & );
  16.       void affiche2();
  17.       void affiche();
  18.       baton operator () (float const &, float const &, char = 'o');
  19.       baton & operator = (const baton & );
  20.       baton operator+= (float const & );
  21.       baton operator* (float const & );
  22.       baton operator+ (float const & );
  23.       void chg_size (float const &nv) { pas=nv; }
  24.       void affectation (list<float> &, list<float> & );
  25.       void affectation_p (list<float> &, list<float> & );
  26.      
  27. };
  28. class carre : public baton
  29. {
  30. private :
  31.     static float unite;
  32.    protected :
  33.     bool actif;
  34.    public :
  35.     //constructeur
  36.       carre(float=0, float=0);
  37.       carre(float, floatbool);
  38.       //constructeur par copie
  39.       carre (const carre & );
  40.       //void chg_unite (const float &t);
  41.       carre&  operator+= (const int & );
  42.       carre&  operator*= (const int & );
  43.       carre& carre :: operator += (const carre & );
  44.       carre carre :: operator + (const carre & );
  45.       bool verif_position(list<float> & );
  46.       bool fin_chute     (list<float> & );
  47.       bool move (char );
  48. };
  49. class barre_plate : public carre
  50. {
  51.    private :
  52.       char position;
  53.     int longueur;
  54.       void construction ();
  55.    public :
  56.       barre_plate ();
  57.       barre_plate (float, float, int);
  58.       barre_plate (float, float, int, char);
  59. };


Message édité par weed le 27-06-2003 à 22:58:36
Reply

Marsh Posté le 22-06-2003 à 12:31:17   

Reply

Marsh Posté le 22-06-2003 à 12:47:22    

weed a écrit :


je m'y connais pas trop justement ds les pointeurs ms normallement un new comme malloc fournie un espace memoire et renvoie l'adresse du permier élément de l'objet. Donc je ne sais pas trop comment cela se passe, lorsque l'on met un push_back qui n'attends pas une adresse normallement.


 
et oui je viens juste de penser puisque new renvoie une adresse ca serait plus logique de creer un vector de pointeur de carré pour stocker des adresses (vector<carre> *t;
     ).  
 
Et ainsi tel que je le concois on stocke l'adresse du premier élément de chaque objet renvoyé par new (t.push_back(new barre_plate (0.5,0.4,3,'v')); )


Message édité par weed le 22-06-2003 à 12:49:06
Reply

Marsh Posté le 22-06-2003 à 12:57:50    

vector<carre*> t;

Reply

Marsh Posté le 22-06-2003 à 13:14:46    

tu es un genie taz, cela fonctionne ....
 
je pensais pas que l'on pouvais définir un type comme ca  
 
car avec les types pédéfinis ou tout du moins j'en ai jamais utilisé
 

Code :
  1. char *ptr;


 
je te remercie taz, je vais pour avancer

Reply

Marsh Posté le 22-06-2003 à 13:33:49    

en C++ le polymorphisme passe par le mécanisme des pointeurs. j'espere que tu fais bien attention à avoir tes destructeurs virtuels

Reply

Marsh Posté le 22-06-2003 à 14:10:34    

c'est juste mon avis, mais maintenant que je m'y connais un peu en c++, j'évite les list<truc*>, vector<truc*>, etc, je prefere les list<truc>, vector<truc>, etc. la principale raison est que lors de la destruction du list ou vector, le destructeur (s'il existe) de tous les éléments est automatiquement appelé.

Reply

Marsh Posté le 22-06-2003 à 14:57:39    

Konar a écrit :

c'est juste mon avis, mais maintenant que je m'y connais un peu en c++, j'évite les list<truc*>, vector<truc*>, etc, je prefere les list<truc>, vector<truc>, etc. la principale raison est que lors de la destruction du list ou vector, le destructeur (s'il existe) de tous les éléments est automatiquement appelé.


 
ca dépend tout à fait de l'optique de ton conteneur ... Il se peut que des instances soient partagées par plusieurs conteneurs, dans ce cas, on préfère faire une destruction manuelle ...
 
 
Edit : ou avoir un seul conteneur qui référencera tous les objets à détruire alors que les autres conteneurs passeront par des pointeurs ...


Message édité par theshockwave le 22-06-2003 à 14:59:15

---------------
last.fm
Reply

Marsh Posté le 22-06-2003 à 15:22:25    

Konar a écrit :

lors de la destruction du list ou vector, le destructeur (s'il existe) de tous les éléments est automatiquement appelé.


 
 :whistle:  
 
Je viens de comprendre mon plantage au travail  [:kadreg]


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 22-06-2003 à 16:39:59    

et le polymorphisme vous faites comment? :heink:

Reply

Marsh Posté le 22-06-2003 à 17:05:49    

Avec des std::list<boost::shared_ptr<truc> > ?

Reply

Marsh Posté le 22-06-2003 à 17:05:49   

Reply

Marsh Posté le 22-06-2003 à 17:10:07    

oui, cela dit, si t'as pas besoin de sharedptr, tu peux tres bien faire sans
 
 
edit: cela dit je te soutiens, ça permet un comportement plus sain notemment au niveau des fuites de mémoires. Mais on peut contourner le problème avec un peu de travaille en faisant un petit wrapper à son conteneur, y a juste à faire un destructeur qui delete chaque élément de la collection.


Message édité par Taz le 22-06-2003 à 17:15:24
Reply

Marsh Posté le 22-06-2003 à 17:42:12    

++Taz a écrit :

et le polymorphisme vous faites comment? :heink:  


 
Le polymorphisme, ca sert à rien :o
 
 
 
:D Bon ... D'accord ... Mais comme je l'ai dit plus haut, ca dépend de l'utilisation qu'on va en faire par la suite ...


---------------
last.fm
Reply

Marsh Posté le 27-06-2003 à 23:05:37    

++Taz a écrit :

en C++ le polymorphisme passe par le mécanisme des pointeurs. j'espere que tu fais bien attention à avoir tes destructeurs virtuels


 
euhh pour la destruction vous faites comments ....
pour l'instant je fais avant de perdre l'adresse avec mon  
 

Code :
  1. queue.erase(ind);
  2. je fais un queue[tmp]->efface();


(tmp et ind indique le meme emplacement)
efface est une methodes appellant  
 

Code :
  1. void baton :: efface ()
  2. {
  3.    coordx.erase(coordx.begin(),coordx.end());
  4.    coordy.erase(coordy.begin(),coordy.end());
  5. }


 
je sais c'est un peu bourrin ms bon  
faudrait que je fasse un destroy ou autre chose ...
j'ai vu effectivement qu'il y aussi un destructeur pour chaque conteneur ...

Reply

Sujets relatifs:

Leave a Replay

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