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
Merci.
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(); \ } \
EDIT : voila pour le moment mon code minimal qui pose problème :
main.cpp
Application.hpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Application & a = Application::Instance();
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
Singleton.cpp
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
L'erreur à la compilation :
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 ;
error LNK2001: symbole externe non résolu "private: static class Application * Singleton<class Application>::Inst_" (?Inst_@?$Singleton@VApplication@@@@0PAVApplication@@A)
Partager