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 et l'héritage


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 18
    Points : 14
    Points
    14
    Par défaut Singleton et l'héritage
    Bonjour,

    Je suis entrain de développer une classe singleton qui hérite d'une autre classe qui n'est pas singleton.
    Est-ce que vous pouvez me dire si cette architecture est utilisé souvent et ne présente pas de problème particulier ?
    Ou il faudrait que les deux classes soit des singletons ?

    Voici un exemple de ce j'ai fais dans mon code (Shape et Rectangle sont des exemples pour exprimer la solution que je suis entrain d'implémenter).

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #include <iostream>
     
    using namespace std;
     
    // Base class
    class Shape 
    {
       public:
    	  Shape(){}
    	  ~Shape(){}
     
          void setWidth(int w)
          {
             width = w;
          }
          void setHeight(int h)
          {
             height = h;
          }
       protected:
          int width;
          int height;
    };
     
    // Derived class
    class Rectangle: public Shape
    {
        private:
            /// Constructor
            Rectangle();
            /// Destructor
            ~Rectangle();
            /// Singleton instance
            static Rectangle *m_pcInstance;
     
       public:
     
    		Rectangle* Rectangle::getInstance()
    		{
    			if(m_pcInstance == NULL)
    				m_pcInstance = new Rectangle();
    			return m_pcInstance;
    		}
     
    		Rectangle::Rectangle()
    		{
    		}
     
    		Rectangle::~Rectangle()
    		{
    		}
     
    		void Rectangle::vKill()
    		{
    			if(m_pcInstance != NULL)
    			{
    				delete m_pcInstance;
    				m_pcInstance = NULL;
    			}
    		}
     
          int getArea()
          { 
             return (width * height); 
          }
    };
    Merci de votre aide.

  2. #2
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Non, ca ne pose pas problème.

    Mais par contre, un singleton est rarement une bonne idée.
    Il s'agit en effet d'une variable globale (comme toute variable statique d'une classe), qui a en général le tord d'être modifiable.

    Au passage, tu as oublié de définir getArea() comme une fonction constante.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 631
    Points : 10 559
    Points
    10 559
    Par défaut
    Citation Envoyé par leternel Voir le message
    Mais par contre, un singleton est rarement une bonne idée.
    Il s'agit en effet d'une variable globale (comme toute variable statique d'une classe), qui a en général le tord d'être modifiable.
    Bof

    Tu mets ton singleton dans la classe principale (ou celle la plus à même de le gérer) et ensuite tu le passes en paramètre en cas de besoin.
    Cela s'appelle Dependency injection il me semble

  4. #4
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Et du coup, ce n'est plus un singleton, c'est un objet ayant une instance unique.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 18
    Points : 14
    Points
    14
    Par défaut
    Merci pour vos réponses.
    Pour l'instant je vais garder la solution du singleton si elle ne présente pas de problème.
    Je regarderais aussi la "Dependency injection".

    Merci,

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    en fait, je modérerais très fort la réponse de leternel : le langage l'accepte et on peut donc dire que... cela ne pose pas de problème.

    Par conte, d'un point de vue conceptuel, il en va tout autrement, car, pour qu'une relation d'héritage puisse exister, il faut que le LSP soit tout à fait respecté, et ca, dans le cas présent, c'est très loin d'être prouvé.

    Et puis, comme te l'ont déjà fait remarquer mes condisciples, l'idée même d'avoir recours à un singleton est rarement une bonne idée, parce que, pour qu'elle puisse être acceptée, il faut remplir deux conditions:
    1. il ne peut y avoir qu'une seule et unique instance tout au long de l'exécution et
    2. (surtout) l'instance en question doit être accessible depuis partout

    Si la première condition est souvent présente, il "n'est pas rare" que la présence de la deuxième condition soit le symptôme d'un mauvais découpage de ton projet qui finira, tôt ou tard, par t'embrouiller complètement à cause des dépendances qui partent dans tous les sens
    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

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    En fait, c'était ce que je voulais dire, mais très mal
    Merci Koala01 de préciser ainsi
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

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

Discussions similaires

  1. Problème d'héritage + singleton
    Par jeremm dans le forum C#
    Réponses: 11
    Dernier message: 20/04/2010, 15h34
  2. Template, Singleton et Héritage
    Par al2000 dans le forum C#
    Réponses: 3
    Dernier message: 19/04/2009, 20h21
  3. [Singleton] Héritage et Singleton
    Par Arno83 dans le forum Design Patterns
    Réponses: 7
    Dernier message: 05/02/2009, 17h11
  4. [Singleton] [Java] Singleton et héritage
    Par Didier 69 dans le forum Design Patterns
    Réponses: 4
    Dernier message: 13/01/2007, 12h18
  5. Réponses: 14
    Dernier message: 02/02/2006, 18h32

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