Bonjour a tous.
Suite à des recherches sur le patern (ou anti) singleton, j'ai pensé une chose.
Pourquoi ne pas globaliser des variables locales ?
Ca donnerai un truc du genre :
De cette facon , on peut rendre globale une variable un temps donné en sachant où et quand le programeur détruit manuellemnt la donnée.
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
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; }
Je sais que mon truc c'est du singleton-like mais je tient quand même a dire que ce n'est un singleton,puisque on peut crée autant d'instance qu'on veut et que la classe na (logiquement) pas la gestion de la création et de la destruction des variables.
Alors qu'en pensez vous ?
Edit : existe un moyen d'empecher le destruction de la donnée si on fait un delete sur Test::GetInstance() ?
Partager