2009-03-11 9 views
5

Grüße alle.Deklarieren von Klassenobjekten in einer Header-Datei

Ich scheine auf einem fundamentrum zu hängen, aber ich kann die Lösung nirgendwo finden. Anywho, wird weitermachen und erklären.

Ich habe ein Programm, bestehend aus drei Dateien; main.ccp, add.h, add.cpp.

erkläre ich die Klasse 'SA' in add.h und haben alle meine Funktionen definiert in add.cpp

additional.h

class SA { 
    ... 
public 
    int x; 
} Obj1, Obj2; 

main.ccp

#include "additional.h" 

int main() { 

    Obj1.x = 5; 

    ... 
} 

Diese gibt mir einen Linkfehler beim Kompilieren: Fehler LNK2005: "Klasse SA Obj1" (? Obj1 @@ 3VSA @@ A) bereits definiert in main.obj

Die einzige Definition des Objekts tritt in add.h auf, und nirgendwo sonst. Das Programm kompiliert nur gut, wenn die Objekte in der Haupt-und nicht den Header deklarieren:

main.ccp

Das Problem ist, dass ich die Objekte primarially innerhalb add.cpp verwenden möchten, müssen aber noch um mehrere öffentliche Werte über main.cpp zu initialisieren. Irgendwelche Worte der Weisheit?

Antwort

11

Deklarieren Obj1 und Obj2 in CPP statt bei .h

add.h

class SA { 
... 
public 
    int x; 
}; 

main.cpp

#include "additional.h" 

SA Obj1, Obj2; 

int main() { 

Obj1.x = 5; 

... 
} 

Wenn Sie Obj1 und Obj deklarieren möchten 2 in der H-Datei, fügen Sie extern in der H-Datei wie folgt:

extern SA Obj1, Obj2; 

, aber Sie sollten die Objekte in einer CPP-Datei in Ihrem Projekt erklären:

main.cpp

SA Obj1, Obj2; 

Der Grund dafür ist, dass Sie jedes Mal, wenn Sie die .h-Datei einschließen, Obj1 und Obj2 deklarieren. Wenn Sie also die .h-Datei zweimal einschließen, erstellen Sie zwei Instanzen von Obj1 und Obj2. Wenn Sie das Schlüsselwort extern hinzufügen, teilen Sie dem Compiler mit, dass Sie die zwei Variablen bereits irgendwo in Ihrem Projekt deklariert haben (vorzugsweise in einer CPP-Datei).

+0

perfekt. Vielen Dank! – Raugnar

6

Verwenden Sie extern Schlüsselwort. Deklarieren Sie diese öffentlichen Objekte als extern in der Kopfzeile und definieren Sie dann Instanzen in einer der cpps.

So:

extern SA Obj1; // in header 

SA Obj1;// in any one (no more than one) cpp 
4

Sie können auch die folgende Codezeile in der Header-Datei haben:

static SA Obj1, Obj2; 

Dies wird nur 1 Instanz jedes Objekts zur Laufzeit erstellen und Neudefinitionen verhindern. Beachten Sie jedoch, dass alle Dateien, die die .h-Datei enthalten, die gleiche Instanz dieser beiden Objekte verwenden. Daher müssen Sie beim Zugriff darauf vorsichtig sein.