2016-03-25 20 views
0

initialisiert Ich bin mir bewusst, der statischen Ordnung Initialisierung Fiasko, aber ich frage mich, wenn die folgende auch sie auslösen würde:statische Variable mit einem anderen

const static Point center = CalculateCenter(); 
static Point currentPoint = center; 

Ich möchte zwei statische Variablen haben (interne Verknüpfung in einer TU), eine ist initialisiert und konstant, die andere ist über viele Instanzen geteilt, aber zuerst sollte es den gleichen Wert von center haben.

Würde dies statische Initialisierung Fiasko auslösen? Wenn ja, wie soll ich das stattdessen programmieren?

Antwort

2

Wenn sie alle in der gleichen Kompilierungseinheit sind, dann ist es in Ordnung (wenn Sie sie richtig bestellen). Wenn dies nicht der Fall ist, ist das Verhalten wegen der Reihenfolge der Initialisierung nicht definiert. Sie könnten jedoch center als constexpr anstelle von const deklarieren, dann ist center zur Kompilierzeit bekannt, was in Ordnung sein sollte, aber dann müsste CalculateCenter() auch eine constexpr sein, was vielleicht in Ihrem Fall nicht möglich ist.

2

Es ist klar definiert, dass innerhalb einer Kompilierungseinheit die Reihenfolge gut definiert ist und der Reihenfolge der Deklaration folgt. Das Problem taucht über verschiedene Einheiten auf, was hier nicht der Fall ist, also ist der Code völlig in Ordnung.

1

Wie die vorherige Antwort sagte, gibt es in der gleichen Übersetzungseinheit kein Problem. Die Reihenfolge wird beibehalten.

Wenn die beiden statischen Variablen nicht in derselben Übersetzungseinheit sind, sollten Sie stattdessen die Funktion wie folgt verwendet werden:

//somewhere in a class X 
static const Point& center() { const static Point _center = CalculateCenter(); return _center; } 

//somewhere in a class Y 
static Point& currentPoint() { static Point _current_point = X::center(); return _current_point; } 

Dann, wenn Sie die Variablen müssen Sie die Funktion verwenden Accessoren X::center() oder Y::currentPoint().

Verwandte Themen