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

C++ Discussion :

Détruire un singleton automatiquement ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Par défaut Détruire un singleton automatiquement ?
    Bonjour,

    j'ai une classe CSingleton somme toute classique (c'est à dire avec une fonction GetInstance et une autre Kill). Dans mon programme, j'écrit par exemple:

    CExcel obj;
    Obj = CExcel::Get();


    et à la fin, je ne dois surtout pas oublier un petit CExcel::Kill();

    Oui mais voilà, je suis tête en l'air... Alors je me demandais s'il n'y a pas moyen, par hasard, de rajouter cela quelque part (dans un destructeur par exemple), de manière à ne plus à me préoccuper de cette ligne. Par exemple, à la fin du programme, l'objet "obj" (CExcel obj) est automatiquement libéré, et ~CExcel() est appelé. J'ai essayé d'ajouter Kill() dedans, mais c'est sans effet.

    Bref, comment peut on rendre automatique cet appel ?

    Merci

    Cordialement

  2. #2
    Expert confirmé
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CExcel obj;
    Obj = CExcel::Get();
    A vérifier ... mais je crois que tu fais une copie de ton objet singleton CExcel.. ce qui ne devrait pas arrivé si ton constructeur par copie est privé.

    De plus, il n'y a pas de méthode générale pour détruire automatique un singleton seul. Il faut un système a part d'enregistrement de ton singleton et de destruction à la fin de l'application. Mais c'est un système à part du pattern singleton

  3. #3
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Là tu cherches quelque chose proche du RAII.
    Dans ton programme il n'y a pas une classe qui est instanciée au début et qui est détruite à la fin du programme ? Elle pourrait porter la responsabilité de ton Singleton et le détruire donc à sa propre destruction.

  4. #4
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static CExcel& CExcel::Get()
    {
        static CExcel instance;
        return instance;
    }
    Et écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CExcel& obj = CExcel::Get();
    Et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CExcel obj;
    obj = CExcel::Get();
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CExcel obj = CExcel::Get();

  5. #5
    Expert confirmé
    Avatar de raptor70
    Inscrit en
    Septembre 2005
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3 173
    Par défaut
    Un singleton, normalement, c'est un pointeur static :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    class CExcel
    {
    public :
        static CExcel & Get( void )
        {
            if( instance == NULL )
            {
                instance = new CExcel();
            }
            return *instance;
        }
     
        static void Kill( void )
        {
            if( instance != NULL )
            {
                delete instance;
            }
        }
     
    private :
        CExcel(){}
     
        static CExcel * instance;
    };

  6. #6
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    L'implémentation proposée par loufoque est aussi très utilisée raptor

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/01/2012, 13h51
  2. Réponses: 2
    Dernier message: 17/03/2008, 10h58
  3. Génerer automatiquement plusieurs fichier .doc
    Par brunovitch dans le forum QuickReport
    Réponses: 3
    Dernier message: 09/07/2002, 08h19
  4. Re-dimensionnement automatique de composants
    Par ludo_7 dans le forum C++Builder
    Réponses: 10
    Dernier message: 16/05/2002, 16h35

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