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 :

fonctionnement de la classe Singleton


Sujet :

C++

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 21
    Points : 19
    Points
    19
    Par défaut fonctionnement de la classe Singleton
    //quelqu'un pourrait-il m'expliquer pourquoi les destructeurs de
    //MonObjet et Singleton ne
    //sont pas appelés.
    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
     
    class MonObjet
    {
    public:
    	MonObjet() {
    		std::cout<<"construction de MonObjet"<<std::endl;
    	}
    	~MonObjet () {
    		std::cout<<"destruction de MonObjet"<<std::endl;
    	}
    };
     
    class Singleton
    {
    public :
    	Singleton()
    	{
    		std::cout<<"appel constructeur"<<std::endl;
    	};
    	~Singleton()
    	{
    		std::cout<<"appel du destructeur"<<std::endl;
    	}
    	static Singleton * pt;
    	static Singleton * Instance()
    	{
    		if ( !pt) pt = new Singleton;
    		return pt;
    	}
    	MonObjet titi;
    };
    Singleton * Singleton::pt  = 0;
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	Singleton::Instance();
    	return 0;
    }
    d'avance merci

  2. #2
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 21
    Points : 19
    Points
    19
    Par défaut
    En fait je précise la question, je voudrais faire de
    l'allocation dynamique via une classe singleton et ça m'embete
    de la deleter explicitement à la fin de mon prog, il y a sans
    doute une autre solution. En fait je ne sais pas vraiment si
    l'allocation de mémoire via un pointeur satique est deleté
    en fin de prog sans passer par l'appel du destructeur.
    A+

  3. #3
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    bah c'est un peu le principe du singleton. 1 instance unique qui sera détruit en meme temps que ton application.

    à une époque lointaine, on appellait ca une classe globale donc imagine que c'est une variable globale

  4. #4
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 21
    Points : 19
    Points
    19
    Par défaut
    oui en fait pour l'appel de destructeur, ce code marche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	Singleton::Instance();
    	delete Singleton::pt;
    	return 0;
    }
    mais ça m'embete, si je n'ajoute pas la ligne de delete, j'ai
    bien peur que ma memoire reste ou ne reste pas affecte suivant
    tel ou tel OS.

    A+

  5. #5
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    bah oui. Si tu essaies de dire que chaque new doit avoir son delete, tout le monde sera d'accord avec toi

    sinon pour un "vrai" singleton :

    il faut rendre inaccessible le constructeur ( soit un protected soit en private)
    Ajour une methode pour liberer la mémoire, ReleaseInstance ou un nom comme ca qui détruit pt et le met à NULL

  6. #6
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    le design patern du singleton c'est pas tout à fait ca.

    Normalement c'est
    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
     
    class MonObjet
    {
        public:
            static MonObjet& Instance(void)
            {
                    if (!MonObjet::Instance)
                        MonObjet::pInstance = new MonObjet();
                    return *this->pInstance;
            }
            static void Destroy(void)
            {
                     delete MonObjet::pInstance;
                     MonObjet::pInstance = NULL;
            }
        private:
        MonObjet(void);
        virtual ~MonObjet(void);
        static MonObjet* pInstance;
    };
    Il ne faut pas mettre d'autre constructeur en public.
    S'il le faut tu fais une methode MonObjetIni(.....) pour initialiser des membre de ta class.

  7. #7
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    Par la suit pour utiliser la methode Fonc qui est dans MonObjet il te faut tapper :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MonObjet::Instance().Fonc();             // Si la methode Fonc est private biensur  :twisted:

  8. #8
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    Tu ne dois pas faire deux objets différents. ou alors du dérive ta class singleton pour en faire une MonObjet....

  9. #9
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920

  10. #10
    Membre averti Avatar de Rafy
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    415
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 415
    Points : 417
    Points
    417
    Par défaut
    yep Merci Loulou :o

  11. #11
    Membre à l'essai
    Inscrit en
    Mars 2002
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 21
    Points : 19
    Points
    19
    Par défaut
    Salut,

    une petit chose en plus. Le GOF presente comme tu l'as decrit le singleton, mais c'est un peu un "pauvre" singleton car il n'y a pas de synchronisation et si ton programme est multi threader tu peux te retrouver avec plusieurs instance du soi disant singleton. Car il me semble que new n'est pas une operation automique donc une 2ieme thread peut rentrer ds la methode instance avant que la premiere n'ait fini d'allouer l'objet.


    pour la synchro -> ACE http://deuce.doc.wustl.edu/

    @+
    Seb

  12. #12
    Membre à l'essai
    Inscrit en
    Août 2005
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 21
    Points : 19
    Points
    19
    Par défaut réponse
    merci à tous pour toutes ces précisions.

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

Discussions similaires

  1. appelle d'une classe singleton
    Par LeXo dans le forum Langage
    Réponses: 3
    Dernier message: 27/05/2007, 12h19
  2. Vecteurs non remplis, et classe Singleton.
    Par Floréal dans le forum SL & STL
    Réponses: 8
    Dernier message: 23/05/2007, 09h28
  3. Réponses: 14
    Dernier message: 02/02/2006, 18h32
  4. Implemetation de la classe Singleton
    Par lepoutho dans le forum C++
    Réponses: 6
    Dernier message: 20/08/2005, 11h46
  5. [introspection][singleton] introspetion de classe à singleton
    Par Jaxofun dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 18/08/2005, 09h59

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