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 :

un objet qui s'efface d'une liste STL


Sujet :

SL & STL C++

  1. #1
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut un objet qui s'efface d'une liste STL
    Bonjour,
    Alors voila, j'ai créé une "list" d'instances de class, et j'aimerai pouvoir effacer une instance à partir d'une des fonction apellée par cette instance genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void Cbowl::update()
    {
    	remove(me); 
    }
    Le problème c'est que "me" ne marche pas, et je ne sai pas se que je dois mettre à la place.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    Ça sent l'erreur de conception : pourquoi ton objet de type Cbowl aurait-t'il la responsabilité de s'effacer d'une liste ?

  3. #3
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut
    Cbowl est une boule qui parcourt l'écran.
    Elle bouge grace a sa fonction update ( je n'ai pas recopié les lignes en question), et elle doit s'effacer lorqu'elle quitte l'écran.
    Voila pourquoi je veux qu'elle décide elle-même de sa destruction.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    Un objet qui s'efface lui même est en général une très mauvaise idée (cf par exemple http://www.parashift.com/c++-faq-lit...html#faq-16.15). Passe la destruction des boules en dehors de la classe et tout marchera mieux.

  5. #5
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut
    Ok merci, je le détruirai en dehors de la class.

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par roulious
    Un objet qui s'efface lui même est en général une très mauvaise idée
    C'est pourtant un pattern assez courant qui modélise bien ce qui ce passe dans certains cas. Il faut juste l'utiliser avec les précautions que tu as cité, mais c'est tout.

    Mais j'avoue que pour un objet qui appartient à un conteneur, ça ne me viendrait pas trop à l'idée de l'utiliser, la classe encapsulant ce conteneur ayant souvent le rôle de gérer la durée de vie des objets contenus.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Par défaut
    Citation Envoyé par JolyLoic
    C'est pourtant un pattern assez courant qui modélise bien ce qui ce passe dans certains cas.
    J'avoue que je n'ai jamais rencontré de cas où j'aurais eu besoin d'un tel comportement. Aurais-tu un exemple ?

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Par exemple un serveur qui crée un thread d'exécution par requête qu'on lui envoie. Il y a un objet requête qui concrétise ce qui se passe dans ce thread. Une fois la requête terminée, l'objet requête se suicide.

    Dans ce genre de cas, le fait d'avoir un autre objet gérant les requêtes actuellement en vie et détruisant la requête est aussi possible, mais a des désavantages :
    - Qui mieux que la requête sait quand elle est terminée ? Ici, la fin de vie ne vient pas d'un évènement externe, mais bien du comportement même de l'objet.
    - Avoir un tel gestionnaire qui gérerait toutes les threads demanderait de faire une synchronisation inter-threads (potentiellement un goulot d'étranglement de l'application) qui ne sert pas à grand-chose.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2003
    Messages : 65
    Par défaut
    Pour ma part, j'utiliserais un pattern différent: l'objet qui sait qu'il est devenu inutile demande à son créateur de le détruire en lui transmettant un message à cet effet. De cette façon la création et la destruction se font au même niveau tout en laissant à l'objet le soin de déterminer le moment de sa destruction.

  10. #10
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    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 287
    Par défaut
    Procéder ainsi n'est pas toujours évident, ni adapté aux frameworks utilisés.

    Avec ACE, j'ai pas mal de Tâches qui se suicident. Au début c'est surprenant, mais en fait cela se fait non seulement très bien, mais en plus le framework pousse à cela.
    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...

  11. #11
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Avec ACE, j'ai pas mal de Tâches qui se suicident. Au début c'est surprenant, mais en fait cela se fait non seulement très bien, mais en plus le framework pousse à cela.
    C'est ce que faisaient les exemples d'asio au début, mais ils ont préféré par remplacer ça par un truc à base de shared_ptr apparemment.

  12. #12
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut
    Actuellement, j'essaye de le supprimer en dehors de la classe, mais ce la me retourne une erreur "First-chance exception in IKPlus.exe: 0xC0000005: Access Violation."

    Voici le prog :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    	for (Ibowl = Lbowl.begin (); Ibowl != Lbowl.end(); ++Ibowl)
    	{
    		TestCollision();
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void TestCollision()
    {
    	//Si la boule quitte l'écran, on la détruit et on en crée une autre
    	if ( (*Ibowl)->returnposX() < 60 || (*Ibowl)->returnposX() > RESOLUTION_X );
    	{  delete (*Ibowl); Lbowl.erase (Ibowl); CreateNewBowl(); }
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    void CreateNewBowl()
    {
     
    	Lbowl.push_back(new Cbowl());
    	Lbowl.back()->initpos(-50,430,1);
    	Lbowl.back()->load("Medias/Sprites/Bowl.png",54,54,1,1);
        Lbowl.back()->hit = FSOUND_Sample_Load( FSOUND_FREE, "Medias/Sounds/Effect.wav", 0, 0, 0);
     
    }

  13. #13
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651

  14. #14
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut
    A la place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    {  delete (*Ibowl); Lbowl.erase (Ibowl); CreateNewBowl(); }
    je met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    {  Lbowl.remove(*Ibowl) ; CreateNewBowl(); }
    mais j'ai toujours "Access Violation"

  15. #15
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ajouter et supprimer des éléments durant un parcours, c'est casse-gueule à moins de savoir exactement ce que l'on fait.

    Tu ne devrais pas utiliser remove, mais erase (correctement, comme expliqué dans la FAQ) pour être sûr que ton itérateur pointe au bon endroit après suppression.

    Pour ce qui est de l'ajout, ici ça ne devrait pas poser trop de problèmes.

  16. #16
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut
    A 1ère vue sa marche, mais quand je regarde le gestionnaire de tache de windows, je constate que la mémoire continue d'augmenter alors que je supprime pourtant bien l'objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for (Ibowl = Lbowl.begin (); Ibowl != Lbowl.end();)
    {
    	if ( ...) ){Ibowl = Lbowl.erase(Ibowl);}else{++Ibowl;}
    }

  17. #17
    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 : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Où est le delete ?

  18. #18
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2006
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 213
    Par défaut
    Exact, j'ai rajouté " delete *Ibowl " et ça marche nickel.
    Merci à tous pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. texte qui s'efface d'une combobox
    Par flyhb dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/03/2009, 14h05
  2. Réponses: 1
    Dernier message: 30/06/2008, 12h55
  3. Création d'une fonction qui prend en argument une liste de cellule
    Par Dereck07 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 29/12/2007, 20h49
  4. Réponses: 4
    Dernier message: 09/08/2006, 10h41

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