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 :

Membre statiques et templates


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 136
    Par défaut Membre statiques et templates
    Bonjour,

    Je veux créer une classe Singleton à base de template pour mon programme et je voudrais donc faire un pointeur vers l'objet Singleton (qui devra de plus être statique pour le reste du programme, pour que ce soit plus pratique). Pour être sûr de manipuler un pointeur 'neuf', je veux l'initialiser à NULL comme par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ecran* ecran::instance = NULL;
    J'ai donc essayé de deviner ce que ça donnerait avec un template et j'ai essayé plusieurs syntaxes, mais le compilateur n'en veut pas . Je pensais donc à quelque chose comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    T Singleton::m_instance = NULL;
    //'T' does not name a type
    <T*> Singleton::m_instance = NULL;
    //error: expected unqualified-id before '<' token
    <T> *Singleton::m_instance = NULL;
    //error: expected unqualified-id before '<' token
    Ce n'est pas tout ce que j'ai essayé mais bon le reste ne marche pas mieux... Pour info, la classe se nomme Singleton, le membre à initialiser m_instance et le type est T comme dans la déclaration ci-dessous:

    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 Singleton
    {
        public:
        static T* getInstance();
        static void kill();
     
        protected:
        Singleton();
        ~Singleton();
        static T *m_instance;
    };
    Merci d'avance si vous pouvez m'aider (et que vous le faites ).

  2. #2
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    C'est la même logique que pour implémenter une fonction membre template.

    cad :

    ListeDesParametresTemplatesDeLaClasse
    Type
    NomDeLaClasse<ParametresTemplates>::NomDeLAttribut;

    Je te laisse essayer

    Par contre, inutile d'utiliser ta classe pour gérer les singletons. Utilise plutôt celle de Loki qui est bien faite. Je te conseille de lire aussi "Modern C++ Design" qui traite du sujet.

  3. #3
    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,

    Si tu veux implémenter un singleton sous la forme d'une classe template, il faut utiliser, entre autre, ce que l'on appelle le CRTP (Curiously recurring template pattern)

    En gros, cela va s'articuler ainsi:

    D'un coté, une classe template qui va permettre d'obtenir/de libérer l'instance unique sous la forme de
    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
    template <class T>
    class TSingleton
    {
        public:
            static T* getInstance()
            {
                if(! instance)
                    instance=new T;
                return instance;
            }
            static void freeInstance()
            {
                delete instance;
                instance=NULL;
            }
        private:
            /* l'instance de l'objet réel */
            T* instance;
            /* l'interdiction d'utilier les constructeurs et le destructeur
             */
            TSingleton<T>(){}
            ~TSingleton<T>(){}
            TSingleton<const T*&>(){}
    };
    /* il faut enfin veiller à initialiser la variable statique */
    T* TSingleton<class T>::instance=NULL;
    De l'autre, on trouvera les classes qui en héritent, et qui mettent en place le CRTP sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class MonSingleton: public TSingleton<MonSingleton>
    {
        friend class TSingleton<MonSingleton>;
        public:
            /*...*/
        private:
           /*...*/
    };
    Tout cela se trouve dans l'excellent article de laurent gomilla sur la réalisation d'un moteur 3D
    [EDIT] un T* manquant
    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

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 136
    Par défaut
    Désolé NiamorH mais je comprends pas trop^^, tu entends quoi par ListeDesParametresTemplatesDeLaClasse? J'ai essayé plusieurs tournures mais sans succès:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    T* Singleton<T>::m_instance = NULL;
    T* Singleton<class T>::m_instance = NULL;
    koala01, je me suis pas mal inspiré de ce genre de Singleton mais le problême c'est que j'ai commencé mon programme différemment et j'ai dus changer 2-3 points pour coller avec ce que je voulais. Il faudrait tout recommencer mais j'ai la flemme^^. Pour l'article de Laurent Gomilla, il est vraiment super mais après quelques temps à essayer de lire le chapitre 2, j'ai laissé tombé. Pour l'instant je vais m'entraîner à openGl en 2D.

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut
    La réponse se trouve dans le lien que t'a donné koala01. (ici).

    Tu descend de quelques lignes et la réponse est là...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 136
    Par défaut
    Ok merci j'étais pas près de le deviner^^

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    267
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 267
    Par défaut
    Au près, tu y étais...

  8. #8
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Par défaut
    Citation Envoyé par Albenejean Voir le message
    Au près, tu y étais...
    Voilà c'etait ça, désolé j'aurais pu être plus clair.

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

Discussions similaires

  1. Spécialisation template vide (pour membres statiques)
    Par LittleWhite dans le forum Langage
    Réponses: 2
    Dernier message: 17/07/2012, 08h36
  2. Template - Spécialisation de membre statique
    Par dragonjoker59 dans le forum Langage
    Réponses: 13
    Dernier message: 10/10/2011, 10h22
  3. class template membre statique
    Par dragonjoker59 dans le forum Langage
    Réponses: 14
    Dernier message: 30/06/2011, 13h50
  4. Réponses: 0
    Dernier message: 25/07/2007, 14h47
  5. Membre statique et DLL
    Par Invité(e) dans le forum Windows
    Réponses: 2
    Dernier message: 15/04/2005, 14h04

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