Переменная класса статического массива "множественное определение" C++
Я пишу некоторый код, где мне нужно иметь переменную класса, которая является статическим массивом int. Я понимаю, что я могу сделать это с чем-то вроде этого в заголовочном файле, ах:
#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 Ao) не удается с помощью "множественного определения`A::a'".
Я искал в Интернете решения, и нашел людей, у которых переменные, объявленные в их заголовках, получают ошибку "множественного определения", когда они включают заголовок в нескольких местах, и решение, по-видимому, заключается в объявлении переменной extern в заголовок, затем определите его только в одном исходном (не заголовочном) исходном файле. Но я не могу объявить переменную класса как статическую, так и внешнюю, не так ли? Если я пытаюсь или просто объявляю его extern, я получаю предупреждение о том, что переменная не является статической (также ошибка "конфликтующие спецификаторы", когда я пытаюсь использовать оба варианта).
Итак, мой вопрос: возможно ли иметь статические переменные класса массива в случае, если файл заголовка должен быть включен в более чем один исходный файл? Если так, то как?
2 ответа
Вы нарушаете одно определение правила. Переместите определение в файл реализации:
//A.cpp
#include "A.h"
const int A::a[] = {1,2};
Решение, к которому вы обращаетесь, с extern
, относится к переменным, не являющимся членами. В твоем случае a
является членом класса.
Вы должны удалить "const int A::a[] = {1,2};" строка из заголовочного файла. Поместите эту строку определения в один из ваших файлов.cpp. Затем вы можете включить заголовочный файл несколько раз, где вам это нужно.