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 :

Erreur de link sur l'implémentation des singletons .


Sujet :

C++

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut Erreur de link sur l'implémentation des singletons .
    Bonjours à tous, je susi entrain de re-voir un peu comment marche le pattern singleton, notament le code de loulou dans la première partie de son moteur 3D.

    Ca va à peu près mais j'ai une erreur de link dés que je tente d'utiliser la méthode "Instance()" .

    J'ai vu en téléchargant le code source de la dernière partie de son tutorial que son implémentation du singleton avait changé entre temps (ca gagnerait d'ailleurs a figurer dans la partie I du tutorial je pense.).

    J'ai vu un morceau de code que je ne comprend pas, ca me parait assez "barbare" et je me demandais :

    1) Pourquoi il fallait utiliser ca?
    2) Comment ca marche? ( je supose que ca doit intimement être lié au "pourquoi")
    3) Y'a moyen de faire autrement ? (sans devoir insérer deux macro dans chaqune de nos classe

    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
     
        ////////////////////////////////////////////////////////////
        /// Macro automatisant la création d'un singleton --
        /// à placer dans la définition de la classe concernée.
        /// La raison pour laquelle il faut redéfinir (et masquer)
        /// la fonction Instance() reste obscure, mais si ce n'est pas
        /// fait le client obtient des erreurs de link sur Inst
        ////////////////////////////////////////////////////////////
        #define MAKE_SINGLETON(Class) \
            public : \
                friend class Yes::CSingleton<Class>; \
                static Class& Instance(); \
            private :
     
        ////////////////////////////////////////////////////////////
        /// Macro automatisant
        ////////////////////////////////////////////////////////////
        #define SINGLETON_IMPL(Class) \
            template <> Class* Yes::CSingleton<Class>::Inst = NULL; \
            Class& Class::Instance() \
            { \
                return Yes::CSingleton<Class>::Instance(); \
            } \
    Merci.

    EDIT : voila pour le moment mon code minimal qui pose problème :

    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    Application & a = Application::Instance();
    Application.hpp
    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
     
    #include <Tools/Singleton.hpp>
     
    #ifndef APPLICATION_HPP
    #define APPLICATION_HPP
     
    	class Application : public Singleton<Application>
    	{
    		friend class Singleton<Application>;
     
    		public:
    			int tmp ;
    	}; 
     
    #endif // APPLICATION_HPP

    Singleton.hpp
    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
     
    #ifndef SINGLETON_HPP
    #define SINGLETON_HPP
     
    	template <class T>
    	class Singleton
    	{
    		public:
     
    			static T & Instance()
    			{
    				if (!Inst_)
    					Inst_ = new T;
    				return *Inst_ ;
    			}
     
    			static void Destroy()
    			{
    				delete Inst_ ;
    				Inst_ = NULL ;
    			}
     
    		protected:
     
    			Singleton()
    			{
    			}
     
    			~Singleton()
    			{
    			}
     
    		private:
     
    			// Data
    			static T* Inst_ ;
     
    			// Construction by Copy , Affectation -> Not allowed
    			Singleton(Singleton&);
    			void operator =(Singleton&);
     
    	}; 
     
    #endif // SINGLETON_HPP
    Singleton.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include <Tools/Singleton.hpp>
     
    // Static menber initialisation .
    template <class T> T* Singleton<T>::Inst_= NULL ;
    L'erreur à la compilation :

    error LNK2001: symbole externe non résolu "private: static class Application * Singleton<class Application>::Inst_" (?Inst_@?$Singleton@VApplication@@@@0PAVApplication@@A)

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Points : 444
    Points
    444
    Par défaut
    http://c.developpez.com/faq/cpp/?pag..._static_erreur

    Après, en mettant l'initialisation de la variable statique du singleton dans le .h, je comprends pas pourquoi il faudrait redéfinir la méthode Instance via les macros.

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    Warf, je viens à l'instant de m'appercevoir de cela :/

    Merci quand même !

    Edit : J'elève mon tag "résolu" mis un peu trop vite, car je m'appercois que j'ai du mal avec la syntaxe template + donné static, si quelqu'un pouvait m'éclairer sur le fonctionnement de la chose . Merci .

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/08/2013, 08h27
  2. Réponses: 10
    Dernier message: 27/01/2013, 15h25
  3. [Administration] Corriger une erreur de jeunesse sur la structure des repositories
    Par vdaanen dans le forum Subversion
    Réponses: 1
    Dernier message: 10/06/2009, 11h22
  4. [Erreur au link sur GTKmm] buttonbox.cpp
    Par Jean_Benoit dans le forum Code::Blocks
    Réponses: 1
    Dernier message: 25/10/2006, 08h48
  5. Erreur de link sur setw().
    Par Rupella dans le forum Visual C++
    Réponses: 7
    Dernier message: 29/07/2006, 13h00

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