IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

Peut-on stocker un objet quelconque dans vector


Sujet :

SL & STL C++

  1. #21
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    vector <Sprite *>::iterator s1;

    for (s1 = m_vSprites.begin() ; s1 != m_vSprites.end() ; ++s1
    {
    delete (*s1);
    }

    m_vSprites.clear();

    C'est mieux ? ^^

    Hum je vais essayer de voir ton tutoriaux sur les pointeurs intelligents, c'est vrai que si j'ai plus à m'occuper à faire les delete de tous mes pointeurs (c'est bien ça l'intêret ?), ce sera super ^^.

    EDIT : ah oui, pendant que j'y suis... Sur mon livre de C++ (enfin dans mes souvenirs ^^), ils disent que l'itérateur est un pointeur.

    Donc que dans l'exemple plus haut s1 est un pointeur vers un élément de la liste. Mais alors pourquoi j'ai à fait lors d'appels de fonctions par exemple de d'abord déréferencer le pointeur et après en plus faire le -> (*s1)->Fonction(). le s1->Fonction() ne fonctionne pas...

    Ce sont des pointeurs de pointeurs ?

    EDIT 2 : oh que je suis con, ça doit être des pointeurs de pointeurs en effet vu que c'est un vector de pointeur ^^.

  2. #22
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    C'est mieux ? ^^
    Oui.

    oh que je suis con, ça doit être des pointeurs de pointeurs en effet vu que c'est un vector de pointeur ^^
    Oui.
    Par contre attention : les itérateurs se comportent comme des pointeurs, mais n'en sont pas forcément. Dans le cas de std::vector<>::iterator c'est parfois le cas, mais ce n'est pas garanti. Enfin de toute façon ce n'est qu'un détail d'implémentation.

  3. #23
    Membre émérite
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Par défaut
    Pour faire simple le fonctionnement des pointeur intelligent est le suivant :

    (la STL en possede : auto_ptr)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PointeurIntelligent <Objet> Pio = new Objet (parametres) ;
    a partir de la le delete sera automatique
    avec des containers, par exemple un vector de sprites:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    vector < PointeurIntelligent<Sprite> > vSprite ;
     
    vSprite.push_back ( new Sprite (parametres)) ;
    vSprite.push_back ( new Sprite (parametres)) ;
    vSprite.push_back ( new Sprite (parametres)) ;
    et c'est tout, lorsque tout sera inutile, ils seront delete automatiquement.

    Dans les Pointeurs Intelligents les plus connus sont :
    - loki
    - Boost (un tuto est dispo sur le site)

  4. #24
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Les auto_ptr ne sont pas compatibles avec les conteneurs, attention

  5. #25
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Ah oui, d'après ce dont je me souviens, la lecture retirerait l'objet du conteneur (à supposer que ça compile sans violer la const-correctness...)

    Les shared_ptr de boost (avec comptage de références, c'est ça?) marchent, par contre, non ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #26
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Oui, les pointeurs de Boost implémentent un compteur de référence ou empêche la copie, donc pas de souci.
    Le pb des auto_ptr, c'est que la copie transfert la responsabilité, et lors des copies pour comparer et compagnie, on perd l'objet.

  7. #27
    Membre émérite
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Par défaut
    en effet a noter aussi qu'il n'aime pas le passage par copie sur une fonction pour le meme probleme de transmission de responsabilite.

  8. #28
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Donc, en fait, auto_ptr, ça veut juste dire "je fais automatiquement un delete dans le destructeur"...
    Je pense que l'auto_ptr ne devrait pas être copiable, avec tous ces inconvénients...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #29
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Les std::auto_ptr<> sont parfaits pour ce pour quoi ils sont faits: implémenter une sémantique de déplacement et assumer des responsabilités passagères.

    Il n'est pas rare que mes fonctions reçoivent des auto_ptr<> quand elles sont des puits pour les données pointées reçues -- je préfère ça à une fonction qui prend un pointeur et qui signale dans un endroit obscur de la doc que la donnée pointée sera détruite. Dans le même genre, j'avais croisé un article qui présentait des pointeurs intelligents nondeletable<>. J'aime bien l'expréssivité rajoutée, même si tout devient plus verbeux.

    Et il n'est pas rare non plus que je renvoie des auto_ptr<> pour mes fonctions qui agissent comme des sources de données. L'appellant sait immédiatement qu'il devra assumer la responsabilité de la donnée récupérée.

    NB: Dans les cas sans déplacement, il y a les boost::scoped_ptr<> au détail qu'ils ne disposent pas de fonction release au contraire des auto_ptr<>. Du coup, il m'arrive d'écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::auto_ptr<T> t( new T(42) );
    truc_qui_peut_lever_une_exception();
    mon_vecteur.push_back(t.get()); 
    t.release();
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  10. #30
    Membre émérite
    Homme Profil pro
    Inscrit en
    Février 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 943
    Par défaut
    Oui, il existe autant de SmartPointer que de cas de figure.

    C'est a toi de voir ce qui te conviens le mieux.
    Personnellement je deteste multiplier les possibilité, je prefere largement n'avoir qu'un SmartPointer et m'arranger pour qu'il marche a chaque fois sauf cas extreme.

    Da cette optique j'ai fait ma propre classe de PointeurIntelligent, mais comme certain cas sont impossible.

    * les tableaux [], donc on prend des vector (dans un sens c'est pas plus mal)
    * les cycles (et la c'est trop gourmand a implementer)

    A noter que c'est un excellent exercice.

  11. #31
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    C'est un excellent exercice, mais 99% des résultats de ces exercices ne seront pas à utiliser, les plus grands se sont plantés sur cet exercice périlleux !
    Enfin, pour stocker des pointeurs dans un vector, le plus simple est de les encapsuler dans des shared_ptr<>

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [1.x] [sf 1.2.x] Stocker un objet panier dans la session (myUser?)
    Par thecanea dans le forum Symfony
    Réponses: 2
    Dernier message: 02/04/2009, 16h28
  2. [Conception] Stocker un objet java dans une structure java
    Par m3allem001 dans le forum Langage
    Réponses: 2
    Dernier message: 19/03/2009, 08h41
  3. [Objet OLE]Stocker une base Access dans un champ
    Par SamRay1024 dans le forum Access
    Réponses: 4
    Dernier message: 04/04/2006, 14h23
  4. Réponses: 4
    Dernier message: 01/02/2006, 09h47
  5. objets différents dans un même vector...
    Par Empty_body dans le forum Langage
    Réponses: 7
    Dernier message: 07/01/2006, 18h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo