Statische Array-Klassenvariable “Mehrfachdefinition” C++

Lesezeit: 2 Minuten

Benutzer-Avatar
Regenbogenkobold

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?

Du verstößt gegen die eine Definitionsregel. Verschieben Sie die Definition in eine Implementierungsdatei:

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

Die Lösung, auf die Sie sich beziehen, mit extern, gilt für Nicht-Member-Variablen. In Ihrem Fall a ist ein Klassenmitglied.

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 dort einfügen, wo Sie sie benötigen.

1012550cookie-checkStatische Array-Klassenvariable “Mehrfachdefinition” C++

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy