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 :

Singleton : Instanciation interne : static ou pointeur ?


Sujet :

C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut Singleton : Instanciation interne : static ou pointeur ?
    Bonjour à tous,


    Je connais bien l'utilité d'avoir un Singleton (pour les gestionnaires etc...).

    En revanche, je tombe régulièrement sur deux implémentations.

    L'une :
    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
     
    template<class T>
    class CSingleton
    {
    public:
       T* GetInstance()
       {
           if(!m_pInstance)
              m_pInstance = new T();
           return m_pInstance;
       }
     
       void Release()
       {
           if(m_pInstance)
           {
               delete m_pInstance;
               m_pInstance = 0;
           }
       }
     
    private:
       T* m_pInstance;
    };
    Et l'autre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    template<class T>
    class CSingleton
    {
    public:
       T* GetInstance()
       {
           static T instance;
           return instance;
       }
    };
    Laquelle est préférable ?

    La première différence que je vois est qu'on a pas à gérer la destruction dans la second (l'instance statique étant détruite à l'arrête du programme). L'inconvénient étant qu'on ne contrôle pas le moment de la destruction.



    Merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    Je suis souvent partisan de la seconde version, pour sa simplicité généralement.

    Elle présente par contre quelques inconvénients:
    1) Elle n'est possible que si la construction du singleton n'est pas paramétrée.
    2) Le singleton ne doit pas dépendre d'une autre ressource "static". Le compilateur n'offrant aucune garantie sur l'ordre d'instanciation des variables globales.

    En dehors de ça, c'est kif-kif. Ton code est en revanche faux dans les 2 versions. La fonction membre GetInstance() et la variable membre m_instance doivent être déclarées statiques.

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    1 824
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 1 824
    Points : 1 544
    Points
    1 544
    Par défaut
    Exacte oui, j'voulais juste mettre en valeur le pointeur ou la variable globale.


    Merci

  4. #4
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 282
    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 282
    Points : 11 036
    Points
    11 036
    Par défaut
    Les diverses implémentations possibles sont discutées in-extenso dans Modern C++ Design et dans Imperfect C++.

    Et finalement, l'implémentation que je préfère est encore sous forme d'un fichier squelette qui produit ce genre de choses -- j'ai toujours besoin de fonctionner en environnement MT, j'ai régulièrement besoin de passer des arguments pour initialiser la variable globale, et la construction paresseuse s'est systématiquement avérée être un faux besoin.

  5. #5
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 408
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 408
    Points : 20 542
    Points
    20 542
    Par défaut
    Citation Envoyé par mister3957 Voir le message
    Exacte oui, j'voulais juste mettre en valeur le pointeur ou la variable globale.


    Merci
    Jan Redek a raison : le premier exemple de code donne ce n'est pas un singleton le second oui

Discussions similaires

  1. Singleton avec initialiseur static
    Par christopheJ dans le forum Codes sources à télécharger
    Réponses: 0
    Dernier message: 10/03/2011, 14h37
  2. Singleton ou variables statics """global""" ?
    Par base-un dans le forum Langage
    Réponses: 16
    Dernier message: 27/11/2010, 05h10
  3. Singleton et méthode static
    Par totoche dans le forum Langage
    Réponses: 7
    Dernier message: 21/05/2010, 17h09
  4. [probleme] template singleton et .lib static
    Par typedef dans le forum Bibliothèques
    Réponses: 12
    Dernier message: 09/02/2010, 17h21
  5. instancier un static final Vector
    Par ericpremier dans le forum Langage
    Réponses: 2
    Dernier message: 18/04/2009, 19h12

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