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

  FORUM HardWare.fr
  Programmation
  C++

  destructeur de list ????

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

destructeur de list ????

n°435554
weed
Posté le 22-06-2003 à 12:31:17  profilanswer
 

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
mood
Publicité
Posté le 22-06-2003 à 12:31:17  profilanswer
 

n°435570
weed
Posté le 22-06-2003 à 12:47:22  profilanswer
 

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
n°435577
Taz
bisounours-codeur
Posté le 22-06-2003 à 12:57:50  profilanswer
 

vector<carre*> t;

n°435588
weed
Posté le 22-06-2003 à 13:14:46  profilanswer
 

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

n°435592
Taz
bisounours-codeur
Posté le 22-06-2003 à 13:33:49  profilanswer
 

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

n°435604
Konar
Posté le 22-06-2003 à 14:10:34  profilanswer
 

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

n°435640
theshockwa​ve
I work at a firm named Koslow
Posté le 22-06-2003 à 14:57:39  profilanswer
 

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
n°435650
kadreg
profil: Utilisateur
Posté le 22-06-2003 à 15:22:25  profilanswer
 

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 !
n°435715
Taz
bisounours-codeur
Posté le 22-06-2003 à 16:39:59  profilanswer
 

et le polymorphisme vous faites comment? :heink:

n°435741
verdoux
And I'm still waiting
Posté le 22-06-2003 à 17:05:49  profilanswer
 

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

mood
Publicité
Posté le 22-06-2003 à 17:05:49  profilanswer
 

n°435744
Taz
bisounours-codeur
Posté le 22-06-2003 à 17:10:07  profilanswer
 

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
n°435794
theshockwa​ve
I work at a firm named Koslow
Posté le 22-06-2003 à 17:42:12  profilanswer
 

++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
n°442344
weed
Posté le 27-06-2003 à 23:05:37  profilanswer
 

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


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

  destructeur de list ????

 

Sujets relatifs
le destructeur est il executé a chaque boucle ?[STL] list, push_back et ses joyeux amis... Je comprends pas tout
Que renvoi la commande ftp LIST à mon BufferedReader ?Meilleur system de mailing list ?
Héritage et destructeur[ACCESS] Filtrer données liste déroulante par rapport à une autre list
[Script buggé] Faire une mailing list avec une base MySQLlist et map
[STL] vector/list de structures, recherche d'elements de la structurecomment declarer une list int
Plus de sujets relatifs à : destructeur de list ????


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR