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:
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:
1 2 3
|
Application & a = Application::Instance(); |
Application.hpp
Code:
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:
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:
1 2 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)