statyczna zmienna klasy tablicy „wiele definicji” C ++
Piszę jakiś kod, w którym muszę mieć zmienną klasy, która jest statyczną tablicą int. Rozumiem, że mogę to zrobić za pomocą czegoś takiego w pliku nagłówkowym, A.h:
#ifndef A_H_
#define A_H_
class A
{
public:
static const int a[];
};
const int A::a[] = {1,2};
#endif
Działa to dobrze, jeśli dołączę ten nagłówek tylko do jednego innego pliku, takiego jak poniższy, 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;
}
Ale przypuśćmy, że potrzebuję mojej klasy A, aby była nieco bardziej skomplikowana i chcę mieć również plik A.cpp. Zachowam ten sam plik main.cpp, ale zmienię A.h w następujący sposób (właśnie dodałem funkcję, printA):
#ifndef A_H_
#define A_H_
class A
{
public:
void printA() const;
static const int a[];
};
const int A::a[] = {1,2};
#endif
A potem w pliku 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;
}
Kompilowanie A.o z gcc -o A.o -c A.cpp jest w porządku. Ale połączenie tego podczas kompilowania main.cpp (gcc -o atest main.cpp A.o) kończy się niepowodzeniem z „wielokrotną definicją` A :: a '”.
Przeszukiwałem Internet w poszukiwaniu rozwiązań i znalazłem ludzi, którzy zadeklarowali zmienne w nagłówkach, którzy otrzymali błąd „wiele definicji”, gdy zawierają nagłówek w wielu miejscach, a rozwiązaniem wydaje się zadeklarować zmienną zewnętrzną w nagłówek, a następnie zdefiniuj go tylko w jednym źródłowym pliku źródłowym (innym niż nagłówek). Ale nie mogę zadeklarować zmiennej klasy zarówno statycznej, jak i zewnętrznej, czyż nie? Jeśli spróbuję, lub jeśli zadeklaruję to jako extern, otrzymam ostrzeżenie o tym, że zmienna nie jest statyczna (także błąd „konfliktowych specyfikatorów” podczas próby obu).
Moje pytanie: czy możliwe jest posiadanie zmiennych klasy tablicy statycznej w przypadku, gdy plik nagłówkowy musi być zawarty w więcej niż jednym pliku źródłowym? Jeśli tak to jak?