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

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

1

12.10.2010, 21:50

Globaler Code

Hi,
Ich habe heute mein aktuelles Projekt wieder ein bisschen redesigned und dabei einigen Klassen eine statische variable verpasst. diese variable sollte eigentlich nur ein mal gesetzt werden und "klassenspezifisch" gefüllt werden. Für das "füllen" der variable hab ich also eine statische methode eingebaut, die dann das passende objekt (bzw einen pointer darauf) zurückliefert. So in der Art also:

Type* Class::staticVar = Class::staticMethod();

Wenn ich mich nicht irre gibt es keine andere Möglichkeit eine statische variable zu definieren/initialisieren, als global. Mein Problem ist jetzt, dass dieser globale code wohl direkt am anfang des programmstarts ausgeführt wird (noch vor main()), allerdings braucht die statische methode u.a. einen OpenGL context, sonst funktioniert sie nicht ^^. Natürlich gäbe es die möglichkeit der variable erstmal nen nullpointer zu verpassen, zu warten bis im "richtigen" code ein context erzeugt wurde und dann den richtigen pointer der methode zuzuweisen. Allerdings stellte sich mir jetzt die frage, in welcher reihenfolge denn dieser globale code ausgeführt wird, wenn man seinen code jetzt z.B. auf mehrere klassen und damit auf mehrere .cpp dateien verteilt hat. Kann man die Reihenfolge überhaupt beeinflussen?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »n0_0ne« (12.10.2010, 22:58)


2

12.10.2010, 22:19

Designfehler.
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

3

12.10.2010, 22:57

Das beantwortet meine Fragen jetzt nicht wirklich.

Ich muss zwar sagen, ich bin mit meiner Lösung auch nicht ungedingt glücklich, allerdings habe ich mir jetzt bald 3 Tage lang den Kopf darüber zerbrochen, wie ich meine jetzige Änderung irgendwie sinnvoll in mein Programm einbauen kann, ohne alles komplett über den haufen werfen zu müssen. Mir ist leider nichts besseres eingefallen.

Mir ist auch bewußt, dass man sowas lieber vorher planen sollte, geht aber schlecht, wenn man (noch) keine ahnung von der materie hat ^^

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

4

12.10.2010, 22:58

Warum muss die statische Variable initialisiert sein, bevor überhaupt ein Objekt der Klasse erstellt wird? Kann sie nicht im Konstruktor initialisiert werden?

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

5

12.10.2010, 23:28

[...] ohne alles komplett über den haufen werfen zu müssen.


So läuft das aber nunmal... Entweder im voraus alles richtig durchplanen oder dann eben refactoren...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

12.10.2010, 23:39

Statische Variablen werden initialisiert bevor main() aufgerufen wird. Mehr gibts dazu eigentlich nicht zu sagen!?

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

7

13.10.2010, 09:22

@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 ^^

@dot: d.h. also es ist nicht festgelegt, in welcher reihenfolge die statischen variablen initialisiert werden?

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

8

13.10.2010, 10:09

@dot: d.h. also es ist nicht festgelegt, in welcher reihenfolge die statischen variablen initialisiert werden?
Doch, die Reihenfolge ist festgelegt: http://www2.math.uni-wuppertal.de/~axel/…oop/oop3_7.html

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

9

13.10.2010, 11:19

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 :)

FalkT

Treue Seele

Beiträge: 125

Wohnort: AC

  • Private Nachricht senden

10

13.10.2010, 12:02

@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 ^^
Da ist schon ein Unterschied zwischen "eine Klasse ist ein Singleton" und "der Zugriff auf eine Klasse funktioniert als Singleton".
Aus Bequemlichkeitsgründen verwirklicht man den Singleton-Zugriff als statische "Member-Funktion".

Ich denke, das wäre genau das richtige für deinen Fall.

Werbeanzeige