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

11

05.09.2011, 22:19

Ja. Ich muss die beiden Codes sowieso noch eintippn und kompilieren.

Was mir hier auch noch neu ist, ist die Verwendung von Singleton::Get()->Statusmeldung().
Bisher wurden mit den beiden Doppelpunktoperatoren Klassen-Funktionen ausserhalb der Klasse ihre eigentlichen Aufgaben zugewiesen.
Jetzt wird er aber meiner Meinung nach in einer ganz anderen Art verwendet, nämlich in diesem Sinn: Singleton.Get() oder wie vorher Spieler1.Status() also
statt Punkt jetzt 2xDoppelpunkt aber wie es in dem Buch steht, müsste an der Stelle eigentlich der Rückgabewert stehen also steht da eigentlich etwas in der Art.
Nur kann ich auch sonst z.B. im main() jederzeit per 2xDoppelpunkt auf Funktionen zugreifen? Hat das einen Sinn?
„lean over the bowl and then take a dive all of you are dead. i am alive“

Rushh0ur

Frischling

Beiträge: 67

Beruf: Student Elektrotechnik

  • Private Nachricht senden

12

05.09.2011, 22:42


Nur kann ich auch sonst z.B. im main() jederzeit per 2xDoppelpunkt auf Funktionen zugreifen? Hat das einen Sinn?


Ja hat es.

:: Ist im weiteren Sinne der Scope-Operator mit welchem eine Zugehörigkeit in einem Bereich ausgewählt werden kann.

Man kann diesen verwenden um eine globale Variable explizit anzusprechen, dies ist zB Notwendig wenn du eine globale Variable und eine lokale Variable gleich benennst (z.B iValue), dann kannst du mit ::iValue auf die globale Variable zugreifen und mit einfachen iValue auf die lokale.

Auf statische (static) Memberfunktionen wird wie in diesem Fall auch über Klassenname::StatischeFunktion zugegriffen, dies wird oft gemacht um zu symbolisieren, dass die gegeben Funktion zu einer gegebenen Klasse gehört, könnten jedoch auch komplett rausgenommen werden aus der Klasse und einzeln Definiert werden, dies ist jedoch etwas ungeschickt da man die benötigte Funktion evtl. nicht direkt findet.

Alle unter dem Schlüsselwort namespace Definierten Objekte, Klassen, Funktionen und Variablen müssen durch dass dazugehörige Schlüsselwort plus dem Scope-Operator angesprochen werden.
Beispiel: using namespace std;
Dadurch müssen alle in std vorhandenen Elemente nicht mehr über std::Objekt angesprochen werden und können durch einfaches Objekt verwendet werden.
Sinn solcher Namespace ist es logische Einheiten zusammen zu fassen um unter Umständen gegeben Kollision mit Gleichnamigen Klassen in anderen Bibliotheken zu vermeiden.

Mfg Rushh0ur

13

06.09.2011, 09:47

Ich les mir die Abschnitt nochmal durch.
„lean over the bowl and then take a dive all of you are dead. i am alive“

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »JoeChip« (06.09.2011, 10:35)


ridens

Frischling

Beiträge: 47

Beruf: Freiberuflicher Entwickler

  • Private Nachricht senden

14

06.09.2011, 11:32

Ich versuchs möglichst ohne Latein:

CLogfile erbt von TSingleton. Damit hat CLogfile jetzt genau die Variablen und Funktionen von TSingleton auch. Würde ich per

C-/C++-Quelltext

1
CLogfile myFile;
eine Instanz erzeugen, wäre allerdings das ganze Singleton-Gezeugs für die Katz. Beim Singleton gehts ja darum, sicherzustellen, dass es nur eine Instanz gibt, und das macht unsere Get()-Funktion. Die hat CLogfile ja gerade von TSingleton geerbt.

Get() ist statisch. Auf statische Member greift man mit Klassenname::Member zu. Wie du siehst ist das hier tatsächlich einfach eine neue Anwendungsweise von :: :) Der Sinn dahinter ist der, dass ein statisches Member ja nicht wirklich zu einer Funktion oder einer Instanz gehört, es gehört zu der Klasse selbst. Also muss man direkt über den Namen der Klasse irgendwie drauf zugreifen. Und beim Definieren einer Funktion außerhalb der Klasse wird ja :: auch bereits benutzt, von daher denke ich mal, es wurde die gleiche Syntax genommen, weils irgendwie Ähnlichkeit hat.

Um jetzt also letztendlich tatsächlich die Logfile-Instanz zu bekommen, benutze ich

C-/C++-Quelltext

1
CLogfile::Get()
Das gibt mir den Zeiger auf die Logfile-Instanz. (Und falls es noch keine gab, wird eine angelegt.)

Und natürlich muss ich bei einem Zeiger den -> Operator benutzen, um auf public Member zuzugreifen:

C-/C++-Quelltext

1
2
3
CLogfile::Get()->Text("Hallo Welt");
//Das ist das gleiche wie
Logfile-Instanzzeiger->Text("Hallo Welt");


Und da die Funktionen von TSingleton statisch sind, hast du nicht nur aus main() sondern restlos von überall her Zugriff darauf. Das ist ja eben das problem, es ist global.

15

06.09.2011, 12:43

Danke fürs Latein weglassen ;-)
Es wird immer verständlicher *yeah*
Wie verhinderst du aber, dass keiner eine eigene Instanz der CLogfile erstellt? Es muss jeder wissen und sich daran halten, dass man über die Singleton geht.
„lean over the bowl and then take a dive all of you are dead. i am alive“

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

16

06.09.2011, 13:02

Der Konstruktor von CLogfile ist private. Somit kann niemand außer CLogfile selbst eine Instanz erstellen (denn niemand sonst hat Zugriff auf den Konstruktor). Das ist genau der Kern des Singleton-Pattern.

17

06.09.2011, 13:51

Eigentlich steht er auf S.246 als public drin.
„lean over the bowl and then take a dive all of you are dead. i am alive“

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

18

06.09.2011, 13:54

Dann ist es kein richtiges Singleton ;)

19

06.09.2011, 14:08

Dann ist es kein richtiges Singleton ;)

Ich geh da jetzt einfach mal drüber :-)
Im Prinzip weiß ich was es macht und fertig.
„lean over the bowl and then take a dive all of you are dead. i am alive“

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

20

06.09.2011, 14:13

Es ist gut, verstanden zu haben, wie das Singleton funktioniert, weil die Implementierung einige interessante Aspekte der Sprache beleuchtet (privater Konstruktor, lokale statische Variable). Verwenden sollte man Singleton aber nicht. Warum hat Fred ja schon ausführlich erklärt, den Vortrag spar ich mir heute mal ;)

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (06.09.2011, 14:23)


Werbeanzeige