Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

28.11.2012, 16:09

Singletons in C++ für Spieleprogrammierer

Hi Leute,
ich hab mich nun erstaunlich einfach durch das Buch C++ für Spieleprogrammierer gearbeitet.
Zwar wurde es immer komplizierter, aber ich konnte noch alles aus dem Kopf heraus programmieren.

Nun bin ich allerdings bei der Singleton Klasse angekommen und ich checke von einen Moment auf den anderen fast nichts mehr.
Ich verstehe zwar die Logik, aber nicht den Code.

Es fängt an mit

static T *m_pSingleton; -> Das ist mir noch klar. Es wird ein statischer Zeiger mit Datentyp T(emplate) mit Namen m_pSingleton erstellt.

Dann geht es jedoch weiter mit

inline static T* Get ()

oder auch mit der Erzeugung der statischen Variable außerhalb der Klasse

T* TSingleton<T>::m_pSingleton = 0;


Was ich hier nicht verstehe: Warum nutzt man hier in beiden Fällen T*? Warum nicht einfach T?

Ich hoffe irgendwer kann mir erklären, warum hier der Stern gesetzt wird, denn ich komme nicht drauf! :crazy:
Ich dachte erst, bei inline static T* Get() würde ein Zeiger auf die Funktion erstellt, allerdings würde das bei T* TSingleton<T>::m_pSingleton = 0; wieder keinen Sinn machen.

Hilfe!! ?(

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

2

28.11.2012, 16:22

ich bin zwar kein C++ Programmierer, würde es aber folgendermaßen erklären:
die Variable ist vom Typ T* (später beim Kompilieren könnte daraus MyClass* werden, wenn MyClass mit dem Template verwendet wird
und das T* stellt den gleichen Datentypen dar, wie auch die Variable hat (der * bezieht sich also nicht auf die Methode, sondern auf den Datentypen

sollte das falsch sein, wird darauf bestimmt jemand anderes hinweisen
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

3

28.11.2012, 17:07

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.

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

28.11.2012, 17:10

(der * bezieht sich also nicht auf die Methode, sondern auf den Datentypen

Genau. Die Funktion gibt einfach etwas zurück, was vom Typ "Zeiger auf T" ist.

5

28.11.2012, 18:12

inline static T* Get () dient dazu einen Zeiger auf die Objektinstanz zu erhalten, also ein Zeiger vom Typ T zu bekommen

T* TSingleton<T>::m_pSingleton = 0; Damit erzeugt man keine Variable ausserhalb der Klasse sondern definiert einen Standardwert für die static T *m_pSingleton; Variable die man in der Klasse defineren muss
Ein Programm macht was du schreibst, nicht was du willst!

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

28.11.2012, 19:17

Wäre vielleicht an der Zeit, dass der Autor das Buch überarbeitet und diesen ganzen Quatsch raus nimmt. Wie oft es hier Beiträge wegen den Singletons gibt. Und eine falsche Verwendung zeigt er damit auch noch.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

7

29.11.2012, 13:03

Hallo zusammen,
vielen Dank für die Antworten! :thumbsup:

Werbeanzeige