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 :

Destructeur statique ?


Sujet :

Langage C++

  1. #1
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut Destructeur statique ?
    Bonjour.

    J'ai créé une classe contenant un certains nombre de variables statiques.
    Le problème que je rencontre est que je dois effectuer un certain nombre d'opérations sur ces variables à leur destruction, mais pas à la destruction de chaque instance.

    Le problème pourrait évidemment être résolu en appelant une fonction à la fin du programme ou bien en utilisant une variable statique pour compter le nombre d'instances existantes et faire ces opérations lorsqu'il atteint 0, mais je me demandais s'il n'existait pas de façon plus "propre" et surtout plus économe de le faire (il s'agit d'une classe très souvent construite et détruite).

    Merci
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  2. #2
    screetch
    Invité(e)
    Par défaut
    tu peux ajouter une classe avec du code dans le destructeur, et une instance statique. Le compilateur garantit que dans un unique fichier C++, les definitions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int Classe::value = 0;
    int Classe::value2 = 0;
    CleanupClasse Classe::actionWhenFinished; // va appeler le constructeur au debut du programme et le destructeur a la fin
    seront construites dans cet ordre et detruite dans l'ordre inverse

  3. #3
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    hmm ok, je comprend. Je n'avais pas pensé à cette solution. Par contre, il me semble que ça ne marche que si CleanupClasse est une sous-classe de Classe (CleanupClasse ne peux pas avoir accès à ses membres privés sinon) ou que nos statiques sont publiques.

    Accessoirement, est-ce que le constructeur de la classe CleanupClasse, en supposant que ce soit une sous-classe de Classe, peux initialiser nos deux variables value et value2 ?
    Je suppose évidemment que les variables devront alors être déclarées dans cet ordre dans classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Classe{
       CleanupClasse actionWhenFinished;
       int value;
       int value2;
    }
    Sinon, à propos du compilateur, cela march-t'il aussi pour une classe template (a raison d'une initialisation par instance template bien sûr).


    Merci
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  4. #4
    screetch
    Invité(e)
    Par défaut
    oui. Mais attention, l'initialisation devra etre faite dans l'autre ordre!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Classe{
       CleanupClasse actionWhenFinished;
       int value;
       int value2;
    }
    va initialiser la classe, qui va initialiser value et value2, puis va initialiser (une deuxieme fois) value 2 et lui mettre la valeur par défaut (0), donc c'est pas ce que tu veux faire.
    Sinon tu as la possibilité de declarer ta classe "friend" de la classe originale pour avoir acces aux variables privées. Et c'est de toute facon une bonne idée de mettre la classe d'initialisation a l'interieur de la classe qui contient les variables (et en privé)

    et oui ca marche aussi avec les templates, de la même facon.

  5. #5
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Citation Envoyé par screetch Voir le message
    oui. Mais attention, l'initialisation devra etre faite dans l'autre ordre!
    Je pensait en fait me passer des construction "externes" de value1 et value2 (et les mettre dans le constructeur de CleanupClasse), mais ça ne doit apparemment pas être possible.


    Merci beaucoup
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,
    Pourquoi ne pas encapsuler toutes tes données statiques dans l'instance unique de CleanupClasse (qui devrait alors changer de nom) pour maîtriser l'ordre de construction et de destruction de ces membres ? Seules l'instance de CleanupClasse reste statique, les autres sont membres non statiques de cette instance.

  7. #7
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    A ce stade, ça me parait effectivement plus censé. Je me demandé si je pouvais éviter la construction d'une sous-classe, mais je devrais y être obligé. (je confesse avoir la flemme de rajouter les SousClasseInstance:: partout... et je préfère restreindre l'utilisation des typedef)

    Par contre, cela va me contraindre à déclarer cette sous-classe friend afin d 'y acceder....

    Merci
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

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

Discussions similaires

  1. [GCC] Réduire la taille d'un programme statique
    Par Geronimo dans le forum Autres éditeurs
    Réponses: 3
    Dernier message: 05/03/2004, 16h34
  2. Impression d'éléments Statiques avec QuickReport
    Par arnaud_verlaine dans le forum C++Builder
    Réponses: 9
    Dernier message: 02/12/2003, 18h49
  3. Analyseurs statiques gratuits ?
    Par patapetz dans le forum Choisir un environnement de développement
    Réponses: 3
    Dernier message: 03/08/2003, 17h56
  4. [Singleton] Différences avec méthodes statiques
    Par Franche dans le forum Design Patterns
    Réponses: 1
    Dernier message: 26/02/2003, 17h10
  5. ActiveX : linker en statique ?
    Par tut dans le forum MFC
    Réponses: 8
    Dernier message: 07/11/2002, 10h24

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