Warum _have_ Sie eine statische C ++ - Membervariable initialisieren?

7

Ich weiß, dass Sie eine statische Membervariable in der Regel in einer CPP-Datei initialisieren. Aber meine Frage ist: Warum haben Sie ?

Hier ist ein Beispiel:

%Vor%

Dies ergibt einen Compilerfehler: undefined reference to 'A::x'

Allerdings:

%Vor%

kompiliert und läuft gut.

Ich kann verstehen, wenn ich den Vektor mit etwas anderem als dem Standardkonstruktor initialisiere, aber ich bin es nicht. Ich möchte nur einen Vektor der Größe 0 erstellt. Sicherlich müssen alle statischen Member bei der Programminitialisierung Speicher zugewiesen werden. Warum verwendet der Compiler nicht einfach den Standardkonstruktor?

    
Lee Netherton 04.11.2010, 15:09
quelle

4 Antworten

14

Das ist nicht um Initialisierung , es geht um definition . Genauer gesagt: es geht darum, zu wissen, welche Kompilierungseinheit (.cpp) das Objekt enthält (das eindeutig SOMEWHERE definiert werden muss)

Was also benötigt wird, ist einfach die Definition irgendwo zu platzieren , in eine eindeutige Stelle , die ein cpp ist, damit der Compiler das statische Objekt der Klasse kennt heißt, es ist dort und nirgendwo anders definiert. (Wenn Sie versuchen, Ihre Static in einer Kopfzeile zu definieren, hat jede cpp, die diese Kopfzeile enthält, eine Definition, die es unmöglich macht zu wissen, wo sie definiert werden sollte - und manuell initialisiert, wenn sie für Sie benötigt wird) .

    
Klaim 04.11.2010, 15:23
quelle
8

Sie betrachten es von einer einzelnen Kompilierungseinheit aus.

Aber die Sprache muss davon ausgehen, dass es möglicherweise mehrere Übersetzungseinheiten gibt. Also, in welcher Kompiliereinheit wird nun das statische Objekt erstellt? Grundsätzlich darf der Compiler diese Entscheidung nicht treffen und der Ingenieur muss die Entscheidung treffen.

    
Martin York 04.11.2010 15:19
quelle
3

undefined reference to 'A::x' ist kein Compilerfehler; Es ist ein Linkerfehler. Dies bedeutet, dass eine Definition von A::x in keiner der Übersetzungseinheiten gefunden werden kann, die zu Ihrem Programm zusammengefügt werden. Statische Elementvariablen haben eine externe Verknüpfung und müssen in genau einer Übersetzungseinheit definiert sein. Alles mit externer Verknüpfung wird keine vom Compiler erzeugte Definition haben, es sei denn, Sie schreiben eine.

    
Steve M 04.11.2010 15:19
quelle
2

Was Sie Initialisierung nennen, ist Definition. Sie müssen das statische Mitglied irgendwo definieren. Der Teil innerhalb der Klasse ist nur eine Deklaration.

Dies liegt vor allem daran, dass eine Definition innerhalb des Headers zu großen Problemen führen würde (da Sie diesen Header nicht in mehrere Übersetzungseinheiten einfügen können, ohne mehrere Definitionen zu verursachen).

    
Let_Me_Be 04.11.2010 15:18
quelle

Tags und Links