Bonjour à tous !
Je suis en train d'améliorer mon lot d'outils et j'ai pensé me faire une classe Singleton. J'ai suivi le tutoriel ici et je n'arrive pas à instancier ma classe. J'ai les erreurs suivantes :
J'ai rassemblé pour vous un code minimal :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 main.o: In function `cbl::Singleton<cbl::LonelyClass>::getInstance()': /home/charles/Workspace/cplusplus/projets/dev_outil_debug-build-desktop/../../libs/libcbl-shared/pattern.hpp:18: undefined reference to `cbl::Singleton<cbl::LonelyClass>::m_instance' /home/charles/Workspace/cplusplus/projets/dev_outil_debug-build-desktop/../../libs/libcbl-shared/pattern.hpp:19: undefined reference to `cbl::Singleton<cbl::LonelyClass>::m_instance' /home/charles/Workspace/cplusplus/projets/dev_outil_debug-build-desktop/../../libs/libcbl-shared/pattern.hpp:20: undefined reference to `cbl::Singleton<cbl::LonelyClass>::m_instance' main.o: In function `cbl::Singleton<cbl::LonelyClass>::kill()': /home/charles/Workspace/cplusplus/projets/dev_outil_debug-build-desktop/../../libs/libcbl-shared/pattern.hpp:22: undefined reference to `cbl::Singleton<cbl::LonelyClass>::m_instance' /home/charles/Workspace/cplusplus/projets/dev_outil_debug-build-desktop/../../libs/libcbl-shared/pattern.hpp:23: undefined reference to `cbl::Singleton<cbl::LonelyClass>::m_instance' main.o:/home/charles/Workspace/cplusplus/projets/dev_outil_debug-build-desktop/../../libs/libcbl-shared/pattern.hpp:24: more undefined references to `cbl::Singleton<cbl::LonelyClass>::m_instance' follow collect2: ld a retourné 1 code d'état d'exécution
pattern.hpp:
main.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
45
46
47
48
49
50
51
52
53 #ifndef PATTERN_HPP #define PATTERN_HPP #include "libcbl-shared_global.h" using namespace std; namespace cbl{ template <typename T> class LIBCBLSHAREDSHARED_EXPORT Singleton { /* Use by declaring a subclass, i.e. * class UniqueObject : public Singleton<UniqueObject>{}; */ public: static T *getInstance(){ if( m_instance == NULL ) m_instance = new T; return ( static_cast<T*> (m_instance) ); } static void kill(){ if( m_instance != NULL ){ delete m_instance; m_instance = NULL; } } protected: Singleton (){} ~Singleton(){} private: static T * m_instance; }; // class Singleton class LIBCBLSHAREDSHARED_EXPORT LonelyClass : public Singleton<LonelyClass> { friend class Singleton<LonelyClass>; private: LonelyClass(){} ~LonelyClass(){} }; // class LonelyClass // LA SOLUTION AU PROBLEME EST LES DEUX LIGNES SUIVANTES template <typename T> T *Singleton<T>::m_instance = NULL; } // namespace cbl #endif // PATTERN_HPP
Avez-vous un indice ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 #include <pattern.hpp> using namespace cbl; int main() { LonelyClass *fh; fh = LonelyClass::getInstance(); fh->kill(); return 0; }
EDIT :
Le code ci-dessous contient la solution (fichier pattern.hpp). La réponse se trouvait dans la FAQ C++ : dans la section des erreurs générées par des membres statiques.
Le titre à été modifié pour mieux décrire le problème.
Merci !
Partager