statische Array-Klassenvariable "multiple definition" C ++

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, A.h.

#ifndef A_H_
#define A_H_

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

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

#endif

Dies funktioniert einwandfrei, wenn ich diesen Header dann nur in eine andere Datei einfüge, etwa in 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;
}

Angenommen, meine Klasse A muss etwas komplizierter sein, und ich möchte auch eine A.cpp-Datei haben. Ich behalte meine main.cpp-Datei bei, ändere dann aber A.h wie folgt (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 A.o mit gcc -o A.o -c A.cpp ist in Ordnung. Das Verknüpfen dieser Datei beim Kompilieren von main.cpp (gcc -o atest main.cpp A.o) schlägt jedoch mit der "Mehrfachdefinition von" A :: a "fehl.

Ich habe das Internet nach Lösungen durchsucht und Leute gefunden, deren Header Variablen enthält, die den Fehler "multiple definition" erhalten, wenn sie den Header an mehreren Stellen einfügen. Die Lösung scheint darin zu bestehen, die Variable extern im zu deklarieren Header, und definieren Sie es dann in nur einer Quelldatei (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 "widersprüchlicher Bezeichner" -Fehler, wenn ich beide versuche).

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage