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 héritable ?


Sujet :

C++

  1. #1
    Membre averti
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Points : 369
    Points
    369
    Par défaut Singleton héritable ?
    Bonjour,

    1. J'aimerais (tout simplement ?) savoir comment faire un singleton pouvant être hérité. Après une brève recherche je n'ai rien trouvé de concluant, car je tombe toujours sur des implémentations ne permettant pas de dériver. Mais est-ce possible ? J'ai beau me creuser la tête je n'arrive pas à voire comment je pourrais faire. Surtout si je veux qu'il puisse être hérité plusieurs fois, çàd avoir des petits-fils.

    2. J'ai un autre problème, c'est la gestion d'un constructeur avec paramètres pour un singleton: si je veux une création transparente du singleton à travers sa méthode "instance()", mais que la construction requiert des paramètres que seules certaines des classes utilisatrices du singleton possèdent, comment faire ?

    Merci d'avance, j'espère avoir été assez clair (rien n'est moins sur)

    PS: je n'ai pas précisé que je reste cantonné au C++, mais bon, vu le forum choisi, vous aurez deviné

  2. #2
    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
    J'avais fini par laisser tomber les singletons à hériter. Dans mes souvenirs j'avais un mélange en "template curieusement récurrent" et amitié, design que je ne trouvais pas excessivement pratique.

    Résultat aujourd'hui j'utilise des fichiers-squelettes (via un plugin que je maintien pour vim ; il doit y avoir des solutions similairesaveclesautres éditeurs de code) qui permettent de définir rapidement des singletons simples (ceux avec la variable locale statique). Pour les singletons plus compliqués, je regarde du côté de Modern C++ Design (qui décore une classe normale pour lui rajouter un aspect singleton), ou ACE (qui dans mes souvenirs définit des singletons héritables qui sont enregistrés dans un Lifetime Manager).

    Si tu veux définir un singleton avec paramètres, en général cela veut dire qu'à un moment précis tu sais comment sera construit le singleton. Et bien à ce moment là tu le construis (avec une fonction membre statique spéciale), ou bien tu le construit (avec un constructeur) et l'enregistre aussitôt dans un objet qui centralise les singletons de ton application.

  3. #3
    Membre averti
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Points : 369
    Points
    369
    Par défaut
    Je devrais donc redéfinir chaque classe fille comme étant un singleton ?
    En redéfinissant, entre autres, une méthode 'instance()' statique ?
    Mais alors le pêre risque de ne plus être un vrai singleton....
    Par exemple, si Pere::instance() est appelé, et qu'ensuite, Fils::instance() est appelé, alors Fils va construire un pêre, ce qui donne deux instances de Pere dans le programme.
    meme problème si plusieurs fils.

    Bref, peux-tu détailler ta façon de faire ? Je n'ai pas saisi ta façon "rapide" de définir des singletons.

  4. #4
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Tiens manière que je me rafaichisse la mémoire, un lien vers le singleton, car ça fait des années que je n'ai pas entendu ce terme.

    D'avance merci

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2002
    Messages : 290
    Points : 325
    Points
    325
    Par défaut
    Je pense qu'en faisant un singleton en utilisant un pointeur static (et non la variable static dans la methode instanciatrice) et des constructeurs protected et non private...

    Du coup les classes filles peuvent appeller les constructeurs de la classe singleton. et si leur methode d'instanciation set la valuer du pointeur, il n'y a pas problème :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    class SingletonPere
    {
       public:
       static SingletonPere* GetInstance();
       virtual ~SingletonPere();   ///< Pour etre plus propre vis à vis de l'heritage. Mais attention où le placer en fonction de qui doit pouvoir detruire le singleton...
       protected:
       SingletonPere();
       static SingletonPere* Self;
    }
     
    class SingletonFils
    {
       public:
       static SingletonFils* GetInstance();
       private:   ///< donc plus heritage possible ensuite
       SingletonFils();
       static SingletonFils* Self;
    };
     
    SingletonPere* SingletonPere::Self=NULL;
    SingletonFils* SingletonFils::Self=NULL;
     
    SingletonPere* SingletonPere::GetInstance()
    {
       if(!Self)   ///< SingletonPere::Self forcement
          Self = new SingletonPere();
       return Self;
    }
     
    SingletonFils* SingletonFils::GetInstance()
    {
       if (!Self)   ///< SingletonFils::Self forecement !
       {
          if(SingletonPere::Self) ///< !Aie! Problème le pere existe déjà
          {
              delete SingletonPere::Self; ///< Un peu radical ? Un autre solution est de renvoyer NULL, a adapeter en fonction des besoins
          }
          SingletonPere::Self = Self = new SingletonFils(); ///< SingletonPere:: Self aussi comme cela SingletonPere::GetInstance renvera vous savez quoi !
       }
       return Self;
    }

  6. #6
    tut
    tut est déconnecté
    Membre averti
    Avatar de tut
    Inscrit en
    Juillet 2002
    Messages
    373
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 373
    Points : 394
    Points
    394
    Par défaut
    je pense que Luc utilise un squelette de fichier avec déclaration de classe, de la fonction qui retourne l'instance, et la petite variable statique... quand tu veux un singleton tu dupliques ton fichier.

    un lien :
    http://www.dofactory.com/Patterns/PatternSingleton.aspx

  7. #7
    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
    Oui, c'est ça

    Sinon, une hiérarchie de singletons me parait bizarre -- je viens juste de comprendre la question originale. Je croyais que tu cherchais un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template <class T>
    struct singleton { 
        T & instance(){ static T s; return s; }
    private: // les constructeurs & co ....
    };
     
    class S : public singleton<S> 
    {
        friend struct singleton<S>;
    ....
    };
    Bref. En fait, il faut se demander ce qui est important. Est-ce :
    - d'avoir des classes dont on ne peut récupérer l'unique instance que via la fonction membre statique instance() ?
    - ou d'avoir des classes dont on peut récupérer l'unique instance via la fonction membre statique instance() ?

    Je dirais que c'est le second aspect le plus important.

    Pour ce qui est de la construction avec une valeur, sort une autre fonction membre statique (si tu utilises l'attribut membre statique de type pointeur), et passe par une phase de préparation dans ton application dans laquelle tous tes singletons sont créés. Tu peux aussi garder cette phase d'initialisation et utiliser un centraliseur d'objets auquel tu demanderas tes singletons.

  8. #8
    Membre averti
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Points : 369
    Points
    369
    Par défaut
    Merci pour vos réponses.
    En effet je veux une hiérarchie de singleton, je vais étudier le code de Gandalf et je reviendrai

    Edit: ok çà va, j'ai un peu adapté le code de Gandalf... Seulement, je ne peux pas faire un template Singleton + un système d'héritage qui marche (pour utiliser ensuite l'héritage multiple "est un singleton" + "est un SingletonPere"), à moins de bidouiller énormément. Je dois donc réécrire à chaque fois tout ce qui concerne la gestion d'un singleton, dans chaque classe. J'ai créé un modèle de code à copier-coller.
    Merci à tous. A+

  9. #9
    Membre averti
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Points : 369
    Points
    369
    Par défaut
    Citation Envoyé par Luc Hermitte
    Oui, c'est ça

    Sinon, une hiérarchie de singletons me parait bizarre -- je viens juste de comprendre la question originale. Je croyais que tu cherchais un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template <class T>
    struct singleton { 
        T & instance(){ static T s; return s; }
    private: // les constructeurs & co ....
    };
     
    class S : public singleton<S> 
    {
        friend struct singleton<S>;
    ....
    };
    Ca, c'est ce que j'ai déjà, et que j'ai dû abandonner (cf message précédent) pour pouvoir faire une hiérarchie de Singletons (c'est bizarre ?).


    Pour ce qui est de la construction avec une valeur, sort une autre fonction membre statique (si tu utilises l'attribut membre statique de type pointeur), et passe par une phase de préparation dans ton application dans laquelle tous tes singletons sont créés
    ok je fais comme çà car c'est ce qui me paraît le plus propre. Si l'initialisation n'a pas été faite alors que getInstance est appelée, je lance une exception. Cependant, çà fait un test de plus. Je ne sais pas si c'est légitime.

  10. #10
    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
    Tu peux peut-etre te contenter d'un assert pour un test qui disparaitra dans la version finale ?

  11. #11
    Membre averti
    Avatar de rolkA
    Inscrit en
    Juillet 2003
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 324
    Points : 369
    Points
    369
    Par défaut
    Citation Envoyé par Luc Hermitte
    Tu peux peut-etre te contenter d'un assert pour un test qui disparaitra dans la version finale ?
    Excellent.
    Merci.

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

Discussions similaires

  1. [GOF] Fabrique abstraite peut-elle être un Singleton ?
    Par manel007 dans le forum Design Patterns
    Réponses: 7
    Dernier message: 06/01/2005, 10h02
  2. [Servlet]Singleton & cache
    Par lucimast dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 15/12/2004, 16h36
  3. [Débutant] pattern singleton
    Par SirDarken dans le forum Débuter avec Java
    Réponses: 22
    Dernier message: 11/12/2004, 01h55
  4. Mutiple row in singleton select ????? [Important, merci]
    Par SkyDev dans le forum Bases de données
    Réponses: 6
    Dernier message: 20/04/2004, 14h02
  5. [debutant]Singleton
    Par bafman dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/01/2004, 15h41

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