Also
inline static T* Get() deklariert einfach eine statische Funktion, die ein Zeiger auf ein T zurück gibt.
T* TSingleton<T>::m_pSingleton = 0;
Ist ein wenig eine gewöhnungsbedürftige Schreibweise. Aber da wird nichts anderes gemacht als die statische Variable m_pSingleton initialisiert.
Diese ist vom Typ
T*. Darum steht das am Anfang der Linie. Dann kommt der Namensbereich, was hier TSingleton<T> ist. Also ein Singleton vom Typ T. Das muss da hin, damit der Compiler weiss welche statische Variable du initialisieren möchtest (für jedes beliebige T wird bei Bedarf ja eine Klasse erzeugt und somit auch jeweils eine eigene statische Variable).
z.B.
Wenn du ein Singleton für deine Klasse Mensch machst wird vom Compiler eigentlich das hier erzeugt:
Mensch* TSingleton<Mensch>::m_pSingleton = 0;
Wenn du jetzt aber auch noch eine Klasse Haus als Singleton haben möchtest wird der Compiler dir das erzeugen:
Haus* TSingleton<Haus>::m_pSingleton = 0;
Das siehst du natürlich nicht, aber wichtig ist hier, dass du 2 verschiedene Klassen mit dem Template erzeugt hast und daher auch 2 verschiedene statische Variablen hast (welche aber für jede Instanz dieser Klasse gleich ist; bei einem Singleton gibts halt auch nur eines).
Vielleicht habe ich dich jetzt auch nur noch mehr verwirrt. Aber deine nächste Frage:
Was ich hier nicht verstehe: Warum nutzt man hier in beiden Fällen T*? Warum nicht einfach T?
Das kommt halt drauf an wie man definiert was T jetzt sein soll. Üblicherweise gibt man in solchen Fällen nicht den Zeiger Typ bei der Template Instanzierung an, sondern den Typ der Klasse. Also:
|
C-/C++-Quelltext
|
1
2
|
TSingleton<Mensch> pMensch; // das wird benutzt
TSingleton<Mensch*> pMensch; // nicht das
|
Man könnte das Singleton auch so schreiben, dass T der eigentliche Zeiger Typ ist und dann könntest du auch einfach T zurückgeben anstatt T*. Gibt aber noch ein paar andere Gründe das so zu definieren.