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:
	
| 12
 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:
	
| 12
 3
 
 |  
 
Application & a = Application::Instance(); | 
 Application.hpp
	Code:
	
| 12
 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:
	
| 12
 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:
	
| 12
 3
 4
 5
 
 |  
#include <Tools/Singleton.hpp>
 
// Static menber initialisation .
template <class T> T* Singleton<T>::Inst_= NULL ; | 
 L'erreur à la compilation :
	Citation:
	
		
		
			error LNK2001: symbole externe non résolu "private: static class Application * Singleton<class Application>::Inst_" (?Inst_@?$Singleton@VApplication@@@@0PAVApplication@@A)