Ich schreibe einen Code, in dem ich eine Klassenvariable haben muss, die ein statisches Int-Array ist. Ich verstehe, dass ich dies mit so etwas in der Header-Datei tun kann, Ah:
#ifndef A_H_
#define A_H_
class A
{
public:
static const int a[];
};
const int A::a[] = {1,2};
#endif
Das funktioniert gut, wenn ich diesen Header dann in nur eine andere Datei einfüge, etwa in die folgende, main.cpp:
#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 angenommen, ich brauche meine Klasse A etwas komplizierter und ich möchte auch eine A.cpp-Datei haben. Ich werde meine main.cpp-Datei beibehalten, aber dann Ah wie folgt ändern (ich habe gerade eine Funktion hinzugefügt, printA):
#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;
}
Das Kompilieren von Ao mit gcc -o Ao -c A.cpp ist in Ordnung. Aber das Verlinken beim Kompilieren von main.cpp (gcc -o attest main.cpp Ao) schlägt mit “Mehrfachdefinition von `A::a'” fehl.
Ich habe das Internet nach Lösungen durchsucht und Leute gefunden, deren Header Variablen deklariert haben, die den Fehler “Mehrere Definitionen” erhalten, wenn sie den Header an mehreren Stellen einfügen, und die Lösung scheint darin zu bestehen, die Variable extern in zu deklarieren Header, und definieren Sie ihn dann in nur einer Quellquelldatei (ohne Header). Aber ich kann eine Klassenvariable nicht sowohl statisch als auch extern deklarieren, oder? Wenn ich es versuche oder wenn ich es nur extern deklariere, erhalte ich eine Warnung, dass die Variable nicht statisch ist (auch ein Fehler “widersprüchliche Spezifizierer”, wenn ich beides versuche).
Meine Frage also: Ist es möglich, statische Array-Klassenvariablen zu haben, falls die Header-Datei in mehr als einer Quelldatei enthalten sein muss? Wenn das so ist, wie?