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)