Reihenfolge Initialisierung von static Membern

Gast #6978852
Lesenswert?

Entwickler schrieb:
> Ich habe in zwei Klassen jeweils ein statisches Objekt, welche ich in
> zwei unterschiedlichen .cpp Dateien initialisier.

Wozu so ein krummes Konstrukt überhaupt andenken?

Normalerweise nimmt man Objekte für Zeugs, was zwar ein individuelles 
Innenleben haben kann, aber von außen für alle derartigen Objekte gleich 
aussieht und gleich funktioniert. Beispiel: grafische Elemente auf dem 
Display. Das eine ist ein Kringel, das andere ein Kreuzel oder so 
ähnlich. Sowas wird beim Instantiieren aufgesetzt und das erfolgt in der 
Datei, die diese Objektklasse definiert. Fertig.

W.S.
#6978859
Lesenswert?

Entwickler schrieb:
> Nun ist meine Frage, in welcher Reihenfolge werden diese initialisiert?

Das kommt darauf an in welcher Reihenfolge der Linker den Code bindet. 
U.a spielt die Reihenfolge der Argumente des Linkers eine Rolle. Das 
Problem umgeht man in dem man eine statische Memberfunktion definiert, 
die man eine Referenz auf ein in der Funktion definierte statische 
Instanz zurückliefern lässt.
#6978869
Lesenswert?

Entwickler schrieb:
> Nun ist meine Frage, in welcher Reihenfolge werden diese initialisiert?
Das ist undefiniert. Besorg dir ein ordentliches C++ Buch. Da wird 
erklärt, wie man mit so einer Situation umgeht.

W.S. schrieb:
> Entwickler schrieb:
>> Ich habe in zwei Klassen jeweils ein statisches Objekt, welche ich in
>> zwei unterschiedlichen .cpp Dateien initialisier.
>
> Wozu so ein krummes Konstrukt überhaupt andenken?
>
> Normalerweise nimmt man Objekte für Zeugs, was zwar ein individuelles
> Innenleben haben kann, aber von außen für alle derartigen Objekte gleich
> aussieht und gleich funktioniert. Beispiel: grafische Elemente auf dem
> Display. Das eine ist ein Kringel, das andere ein Kreuzel oder so
> ähnlich. Sowas wird beim Instantiieren aufgesetzt und das erfolgt in der
> Datei, die diese Objektklasse definiert. Fertig.
>
> W.S.

Was genau willst du damit sagen?
Gast #6978905
Lesenswert?

Mikro 7. schrieb:
> N00B schrieb:
>
>> Wobei die Reihenfolge nur bei Konstruktoreb überhaupt eine Rolle spielt.
>> Globale Variablen werden intialisiert, bevor dein Programm überhaupt
>> startet; daher hat die Reihenfolge keinen Effekt.
>
> Es gibt Konstruktionen wo Funktionen bereits vor main aufgerufen werden.

Ich habe mich etwas unklar ausgedrückt: Variablen (im Sinne von int, 
char, …) werden iirc im Startup initialisiert, da ist die Reihenfolge 
egal (technisch gibt es eine).

Konstruktoren von Objekten werden vor Main() mit einer Reihenfolge 
abhängig davon, was der linker so treibt, aufgerufen.
Gast #6978909
Lesenswert?

EAF schrieb:
> N00B schrieb:
>
>> Iirc ist das undefiniert, müsste von linker abhängen
>
> Nein!
> Die statischen Klasseneigenschaften sind völlig unabhängig voneinander
> und klar definiert.
> Es gibt also kein konkurrierendes Verhalten.

?

Nur weil es nichts gibt, was im dem Beispiel von der Reihenfolge 
abhängen könnte, heißt es nicht, dass es keine Reihenfolge gibt; ein 
Speicherbereich wird halt zuerst beschrieben (auf den Plattformen, die 
ich kenne).
Gast #6978913
Lesenswert?

Entwickler schrieb:
> Header a.hpp
> class A{
>   static int x;
> };
>
> Header b.hpp
> class B{
>   static int y;
> };
>
> Source a.cpp
> int A::x = 0;
>
> Source b.cpp
> int B::y = 0;

Btw: das Beispiel wiederspricht sich mit deiner ursprünglichen Frage, 
wie ich gerade gemerkt habe, ints sind keine Objekte (und führen die 
Frage ad absurdum)
Gast #6978948
Lesenswert?

N00B schrieb:
> Entwickler schrieb:
>
>> Header a.hpp
>> class A{
>> static int x;
>> };
>> Header b.hpp
>> class B{
>> static int y;
>> };
>> Source a.cpp
>> int A::x = 0;
>> Source b.cpp
>> int B::y = 0;
>
> Btw: das Beispiel wiederspricht sich mit deiner ursprünglichen Frage,
> wie ich gerade gemerkt habe, ints sind keine Objekte (und führen die
> Frage ad absurdum)

Ups, ints sind doch Objekte...
Aber Objekte ohne Konstruktoren führen die Frage so oder so ad absurdum

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren