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

Langage C++ Discussion :

apeller une fonction virtuelle depuis le desrtucteur


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut apeller une fonction virtuelle depuis le desrtucteur
    Salut

    Alors j'ai compris qu'on ne pouvait pas le faire, mais j'aimerai trouver un autre moyen.
    Je vous explique mon cas.

    J'ai une classe CThread de base qui s'ocupe de la création et destruction de threads.
    Une classe CExample qui en hérite.

    Le destructeur de Cthread attend la fin du thread, qui est en train de tourner dans une fonction de la classe CExample. Il fait un join sur le thread.
    J'aimerai pouvoir apeller dans ce destructeur une fonction OnStop(), virtuelle, qui est redéfinie dans CExample et qui permet de demander à mon thread de s'areter.

    Comme en C++, l'appel de la fonction virtuelle dans le destructeur de ma classe CThread n'apelle pas celle de la classe CExample, je suis obligé d'ecrire avant chaque delete cexample : cexample.OnStop().

    Y a t'il un autre moyen ?

    merci

  2. #2
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 551
    Par défaut
    Bonjour,

    c'est au destructeur de CExample d'appeler OnStop(), pas à celui de CThread
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut
    Ok.
    J'aurai du y penser, merci.
    Le petit inconvenient c'est qu'on doit l'ajouter dans chaque classe qui dérive de CThread, alors que ça aurait été pratique que ça fasse partie de l'implémentation de CThread justement de s'occuper de ça.

  4. #4
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 551
    Par défaut
    le problème c'est que comme vous l'aviez dit cela n'est pas possible car le destructeur de Cthread est appelé après le destructeur des classes filles

    il reste une autre solution : ne pas directement appeler delete sur les sous classes mais une autre opération définie sur Cthread et qui fera l'appel d'OnStop puis le delete.
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

  5. #5
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par bruno_pages Voir le message
    il reste une autre solution : ne pas directement appeler delete sur les sous classes mais une autre opération définie sur Cthread et qui fera l'appel d'OnStop puis le delete.
    Si j'interprète bien ce que tu propose, cela donnerait quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Cthread 
    {
        public: 
            virtual void onStop() = 0;
            void destroy()
            {
                onStop();
                delete *this;
            }
            /*...*/
    };
    Mais il y a alors un problème, du fait de l'appel de delete sur this:

    Si tu travailles avec un pointeur sur CThread, tu en arrivera à une situation dans laquelle ton pointeur semble toujours pointer vers une adresse valide, alors que la dite adresse a été invalidée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void foo(CThead * ptr)
    {
        /*...*/
        ptr->destroy(); // DANGER 
        /* y a d'autre choses à faire, on "oublie" que ptr a été détruit...*/
        ptr->machinChose(); //BOUM... ptr représente une adresse invalide
    }
    Si on travaille avec un objet, c'est encore pis: on cours tout droit vers une tentative de double destruction d'un objet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void bar()
    {
        /*CExemple hérite de CThread ;-) */
        CExemple mt(/*parametres éventuels */);
        /* Tout va très bien, madame la marquise ...*/
        mt.destroy(); // CRACK : première destruction de l'objet
        /* éventuellement une ou deux choses à faire après */
    } // BOUM : destruction automatique de mt... qui a déjà été détruit :-P
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Modérateur
    Avatar de bruno_pages
    Homme Profil pro
    ingénieur informaticien à la retraite
    Inscrit en
    Juin 2005
    Messages
    3 551
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur informaticien à la retraite
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 3 551
    Par défaut
    Bonjour,

    il est bien évident qu'appeler machinchose après destroy est absurde, mais ni plus ni moins qu'après delete

    bien-sur cela ne marche pas dans le cas d'une variable auto détruite, mais ni plus ni moins que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    {
      CExemple e;
      delete &e
    }
    cette solution n'était qu'un pi aller (je ne sais pas si cela s'écrit ainsi ), encore une fois la bonne solution est d'appeler OnStop dans le destructeur des sous classes
    Bruno Pagès, auteur de Bouml (freeware), mes tutoriels sur DVP (vieux, non à jour )

    N'oubliez pas de consulter les FAQ UML et les cours et tutoriels UML

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 07/06/2010, 20h25
  2. Réponses: 2
    Dernier message: 05/03/2006, 19h29
  3. Faire apelle a une fonction javascript depuis un onclick=&am
    Par pierrot10 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 27/12/2005, 21h41
  4. [Info] Appeler une fonction Ada95 depuis Java
    Par mmathieu dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 15/09/2005, 09h42
  5. Comment appeler une fonction JavaScript depuis Delphi ?
    Par Alfred12 dans le forum Web & réseau
    Réponses: 4
    Dernier message: 17/06/2005, 18h15

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