Singleton et héritage, membres statiques donnant des erreur à l'édition des liens
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 :
Code:
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 |
J'ai rassemblé pour vous un code minimal :
pattern.hpp:
Code:
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 |
main.cpp :
Code:
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;
} |
Avez-vous un indice ?
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 !