globale variable erst später initialisieren
-
hallo, ich habe folgendes problem.
ich erstell ein Objekt einer Klasse global. das ist ja weiter nicht schlimm. nur theoretisch darf diese erst erstellt werden wenn bestimmte initialisierungen abgeschlossen sind. hier mal pseudocode:Klasse theApp;
int main()
{
init();
}das problem an sich ist das ich noch zig andere funktionen habe die auf dieses Objekt zugreifen und ich es nicht jedes mal übergeben will.
Also kann man eine globale variable auch innerhalb einer fremden funktion definieren ala:int main()
{
init();
create();
}void create()
{
Klasse theApp //aber global
}vielen dank für eure hilfe.
ps. hätte auch kein problem auf ne extra datei auszuweichen, aber da der compiler ja sowieso die Instanz gleich erstellt isses nicht wirklich n ausweg.
-
Suche mal nach dem Begriff "Singleton".
Stefan.
-
greenghecco schrieb:
ich erstell ein Objekt einer Klasse global. das ist ja weiter nicht schlimm.
Doch!

greenghecco schrieb:
das problem an sich ist das ich noch zig andere funktionen habe die auf dieses Objekt zugreifen und ich es nicht jedes mal übergeben will.
Schreibfaulheit ist ein häufiger Grund für globale Variablen.

Meist kann man solche Dinge besser designen. Wenn du zum Beispiel in einer Klasse ein Referenz auf ein Objekt speicherst, kannst du in deren Memberfunktionen ebenfalls auf dieses zugreifen, ohne es ständig zu übergeben. Indem du dir genau überlegst, wie mehrere Klassen voneinander abhängen, werden globale Variablen in vielen Fällen überflüssig. Nichts ist einfach so da und muss überall bekannt sein.
Sollte nur ein Hinweis für das nächste Mal sein, fast immer lohnt sich eine kurze Designphase, da ein gut strukturiertes Programm auch später einiges erleichtert. Gerade globale Variablen sind relativ mühsam, was das Debuggen angeht, da Fehler nur schwer eingegrenzt werden können.
Ausserdem lösen Singletons die Probleme von globalen Variablen nur bedingt. Sie werden aber gerne als objektorientierter Ersatz angesehen (zu Unrecht).
-
Mit einem Singleton kann man zumindest die Erzeugung bis zum ersten Zugriff hinauszögern und Probleme der Initialiserungsreihenfolge umgehen.