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
Das Richtige für seinen Fall wäre es keine Globale Variable zu verwenden...
@BurningWave: Ohne sie vorher einmal global zu initialisieren beschwert sich mein compiler (gcc), wenn ich sie im ctor initialisiere. Außerdem will ich sie ja nicht in jedem c'tor initialisieren, sondern nur 1 mal, und die klasse ist nunmal kein singleton
C-/C++-Quelltext |
|
1 2 3 4 5 6 7 |
CClass::CClass() { if(!m_pStaticVar) // m_pStaticVar initialisieren // [...] } |
Naja, es ist festgelegt, denn "so wie der Compiler mag" ist auch eine Festlegung. Die eigentlichen Vokabeln um sowas zu beschreiben sind aber "undefined" und "unspecified", denn dazu wird im Standard genau beschrieben, was das heisst.Der Link war sehr hilfreich, danke, aber er widerspricht (teilweise) dem was du sagst ^^ In meinem Eröffnungspost hatte ich ja von mehreren .cpp dateien gesprochen.
Zitat: "Für zwei globale Variablen aus unterschiedlichen Übersetzungseinheiten ist die Reihenfolge dagegen nicht vorgeschrieben. Daher sollte man nie eine von ihnen mit dem Wert der anderen initialisieren; das Ergebnis kann von Compiler zu Compiler verschieden sein"
Das war genau das, was ich wissen wollte :)
Ein Singleton regelt den Zugriff auf ein Objekt und dessen Erzeugung.@FalkT: ich verstehe nicht wirklich, was du meinst, könntest du es nochmal erklären?
C-/C++-Quelltext |
|
1 2 3 4 |
class MyClass { static MyClass* instance() { return Singleton<MyClass>::instance(); } } |
C-/C++-Quelltext |
|
1 2 3 4 |
class MyClass { static MyClass* instance() { return Singleton<MyClass, MySpecialConstructionPolicy>::instance(); } } |
C-/C++-Quelltext |
|
1 2 3 4 5 |
class GlobalData { MyClass* MyClass_instance() { return Singleton<MyClass>::instance(); } MyClass2* MyClass2_instance() { return Singleton<MyClass2>::instance(); } } |
C-/C++-Quelltext |
|
1 |
class MyClass : public Singleton<MyClass> |
Vielleicht ein paar mehr Infos zu meinem Szenario:
Ich habe eine abstrakte (hat pure virtual methoden) Klasse RenderObject mit einigen Hilfsfunktionen und einige Klassen, wie z.B. Cube, Sphere, die von RenderObject erben. Vorher hatte ich die ganzen Daten, wie ein Cube aussieht z.B. in jedem Cube extra gespeichert (sehr viel redundanz). Jetzt will ich es so machen, dass pro Klasse diese daten immer nur 1 mal verfügbar sind, und sie von den hilfsfunktionen von RenderObject genutzt werden können. Mein Vorgehen bis jetzt:
RenderObject eine virtuelle methode getVar() verpasst;virtual, damit immer die passende methode der Kindklasse aufgerufen wird. Diese wird in den Kindklassen implementiert und liefert dann immer die statische variable der Klasse zurück. Diese wird (wie in meinem anfangspost) ein mal mit einer statischen methode initialisiert.
Warum ist dieses vorgehen denn so schlecht? und wie würdet ihr es machen?
@dot: so wie ich dich verstanden habe, hat am ende dann aber doch jedes renderobject die topologischen daten gespeichert?
[...] ich initialisiere sie am anfang jetzt einfach global mit NULL und danach nach BurningWaves vorschlag mit einem if(!staticVar) im constructor auf den richtigen wert... seid ihr damit eher einverstanden?
Werbeanzeige