Я пишу код, в котором мне нужна переменная класса, представляющая собой статический массив целых чисел. Я понимаю, что я могу сделать это с чем-то вроде этого в заголовочном файле, Ah:
#ifndef A_H_
#define A_H_
class A
{
public:
static const int a[];
};
const int A::a[] = {1,2};
#endif
Это работает просто отлично, если я затем включаю этот заголовок только в один другой файл, что-то вроде следующего, 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;
}
Но предположим, мне нужно, чтобы мой класс A был немного сложнее, и я также хочу иметь файл A.cpp. Я оставлю свой файл main.cpp прежним, но затем изменю Ah следующим образом (я только что добавил функцию, 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.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;
}
Компиляция Ao с помощью gcc -o Ao -c A.cpp в порядке. Но связать это при компиляции main.cpp (gcc -o atest main.cpp A.o) не удается с «множественным определением `A::a'».
Я искал в Интернете решения и нашел людей, у которых переменные объявлены в их заголовках, которые получают ошибку «множественное определение», когда они включают заголовок в нескольких местах, и решение, похоже, состоит в том, чтобы объявить переменную extern в заголовке, затем определите его только в одном исходном (не заголовочном) исходном файле. Но я не могу объявить переменную класса как статической, так и внешней, не так ли? Если я попытаюсь или просто объявлю его extern, я получу предупреждение о том, что переменная не является статической (также возникает ошибка «конфликтующие спецификаторы», когда я пытаюсь использовать оба).
Итак, мой вопрос: возможно ли иметь статические переменные класса массива в случае, если файл заголовка должен быть включен более чем в один исходный файл? Если да, то как?