Frage bezüglich Scope (Frage zur Umsetzung in SFML)
-
Hallo,
ich habe gerade aus Interesse SFML studiert und bin dabei in der Datei SocketHelper.cpp auf folgendes Konstrukt gestoßen:
00084 struct SocketInitializer 00085 { 00086 SocketInitializer() 00087 { 00088 WSADATA InitData; 00089 WSAStartup(MAKEWORD(2,2), &InitData); 00090 } 00091 00092 ~SocketInitializer() 00093 { 00094 WSACleanup(); 00095 } 00096 }; 00097 00098 SocketInitializer GlobalInitializer;Quelle: http://www.sfml-dev.org/documentation/1.5/SocketHelper_8cpp-source.htm
Ich habe selber schon mit Sockets gearbeitet und mir ist der Sinn absolut klar.
Mir stellt sich dabei nur die Frage: Wie lange ist das dort angelegte Objekt gültig? Und vorallem: Ab wann?
Ist es nicht so, dass jede Source-Datei eine Art "eigenen Gültigkeitsbereich" hat und so weiter? Ist der hier beschriebene Code also sicher, dass das Objekt nicht mehrfach erstellt wird, etc.
Würde mich über Klärung freuen. Danke

-
Die Variable
GlobalInitializerist spätestens, wenn du in die main kommst initialisiert und wird zerstört, wenn du die main wieder verlässt. Ist also global gültig. Das Problem ist aber, wenn du bereits vorher (z.B in einem Konstruktor eines anderen globalen Variable) darauf zugreifst, denn die Reihenfolge ist nicht geregetl, in denen globale Variablen über verschiedene Übersetzungseinheiten initialisiert werden. Die Zerstört ist in der umgekehrten Reihenfolge, wie sie initialisiert wurden, aber das hilft dir nicht viel, denn du weisst ja nicht, in welcher Reihenfolge die Initialisierung statt gefunden hat.
Mehfrach erstellt wird es nicht nein. Aber man könnte theoretisch selbst eine Variable vom Typ
SocketInitializererstellen und dann hast du das ganze 2x ja. Da sehe ich auch einen der Vorteile von Singletons gegenüber von globalen Variablen (ob Singletons gut oder böse sind sei dahingestellt), denn dort kannst du die Einmaligkeit steuern und ebenfalls, dass zum Zeitpunkt der Benuzung des Objektes eine Instanz da ist. (siehe Meyers Singleton).