5

Ich schreibe Code, wo ich eine Klassenvariable haben muss, die ein statisches int-Array ist. Ich verstehe, dass ich dies wie dies in der Header-Datei mit etwas tun kann, Ah:statische Array-Klassenvariable "multiple definition" C++

#ifndef A_H_ 
#define A_H_ 

class A 
{ 
public: 
    static const int a[]; 
}; 

const int A::a[] = {1,2}; 

#endif 

Dies funktioniert nur gut, wenn ich dann in diesem Header einschließlich bin nur ein andere Datei, so etwas wie die folgenden Haupt. cav:

#include "A.h" 

#include <iostream> 
using namespace std; 

int main() 
{ 

    A myA; 
    cout << "0: " << myA.a[0] << endl; 
    cout << "1: " << myA.a[1] << endl; 
} 

Aber ich nehme meine Klasse A müssen ein bisschen komplizierter sein, und ich möchte eine A.cpp-Datei als auch haben. Ich werde meine main.cpp Datei die gleiche bleiben, aber dann Ah wie folgt ändern (Ich habe soeben eine Funktion, druckenA):

#ifndef A_H_ 
#define A_H_ 

class A 
{ 
public: 
    void printA() const; 
    static const int a[]; 
}; 

const int A::a[] = {1,2}; 

#endif 

Und dann in der Datei A.cpp:

#include "A.h" 

#include <iostream> 
using namespace std; 

void A::printA() const 
{ 

    cout << "Printing in A.cpp." << endl; 
    cout << "A.0: " << a[0] << endl; 
    cout << "A.1: " << a[1] << endl; 

} 

Kompilieren von Ao mit gcc -o Ao -c A.cpp ist in Ordnung. Aber dies beim Kompilieren von main.cpp (gcc -o atest main.cpp A.o) schlägt mit "Mehrfachdefinition von` A :: a '"fehl.

Ich habe das Internet nach Lösungen durchsucht und Leute gefunden, die Variablen in ihren Headern deklariert haben, die den Fehler "Mehrfachdefinition" erhalten, wenn sie den Header an mehreren Stellen enthalten, und die Lösung zu sein scheint, das zu deklarieren Variable extern in der Kopfzeile, dann definieren Sie es in nur einer Quelle (Nicht-Header) Quelldatei. Aber ich kann keine Klassenvariable sowohl statisch als auch extern deklarieren, kann ich? Wenn ich es versuche oder wenn ich es nur extern deklariere, erhalte ich eine Warnung, dass die Variable nicht statisch ist (auch ein "conflicting specifiers" -Fehler, wenn ich beides versuche).

Also, meine Frage: ist es möglich, statische Array-Klassenvariablen für den Fall, dass die Header-Datei in mehr als einer Quelldatei enthalten sein muss? Wenn das so ist, wie?

Antwort

17

Sie verletzen die eine Definitionsregel. Bewegen Sie die Definition innerhalb einer Implementierungsdatei:

//A.cpp 
#include "A.h" 
const int A::a[] = {1,2}; 

Die Lösung Sie sind reffering, mit extern, gilt für Nicht-Mitgliedsvariablen. In Ihrem Fall ist a ein Klassenmitglied.

7

Sie sollten die "const int A :: a [] = {1,2};" Zeile aus der Header-Datei. Fügen Sie diese Definitionszeile in eine Ihrer CPP-Dateien ein. Dann können Sie die Header-Datei mehrmals hinzufügen, wo Sie es brauchen.