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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
#include <iostream>
using namespace std;
template <class T> class Globalisator
{
protected:
static T* m_instance;
public:
static T* GetInstance()
{
if(m_instance==0)
throw; //ici trow seul pour dire que c'est pas bien de
//ne pas initialiser.Il faudrai définir une
// exeption perso.
return m_instance;
}
static void SetInstance(T* inst)
{
m_instance=inst;
}
static void Release()
{
m_instance=0;
}
};
template <class T> T* Globalisator<T>::m_instance=0;
//classe de test
//aucune utilité
class Test : public Globalisator<Test>
{
int m_i;
public:
Test():m_i(0){};
int Test2(){m_i++;return m_i;}
};
//fonction de test
//Réelle utiité dans des classes
void fct()
{
cout<<Test::GetInstance()->Test2()<<endl;
}
int main (void)
{
Test t1,t2;
//je fais ca sur des variables locales.
//Mais comme elles sont locales a main , c'est pas grave.
//le mieux serait de le faire sur des pointeurs alloué dynamiquement.
Test::SetInstance(&t1);
fct();
fct();
Test::SetInstance(&t2);
fct();
Test::Release();
fct(); //test du throw
return 0;
} |