статический массив переменная класса множественное определение C ++

Я пишу код, в котором мне нужна переменная класса, представляющая собой статический массив int. Я понимаю, что могу сделать это примерно так в заголовочном файле A.h:

#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 таким же, но затем изменю A.h следующим образом (я только что добавил функцию 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;

}

Компиляция A.o с помощью gcc -o A.o -c A.cpp в порядке. Но связывание этого при компиляции main.cpp (gcc -o atest main.cpp A.o) не удается с "множественным определением` A :: a '".

Я искал в Интернете решения и нашел людей, у которых в заголовках объявлены переменные, которые получают ошибку «множественного определения», когда включают заголовок в нескольких местах, и решение, похоже, состоит в том, чтобы объявить переменную extern в заголовок, затем определите его только в одном исходном (не заголовочном) исходном файле. Но я не могу объявить переменную класса как статической, так и внешней, не так ли? Если я попытаюсь или просто объявлю его как extern, я получаю предупреждение о том, что переменная не является статической (также возникает ошибка «конфликтующие спецификаторы», когда я пробую оба).

Итак, мой вопрос: возможно ли иметь переменные класса статического массива в случае, если файл заголовка должен быть включен более чем в один исходный файл? Если да, то как?


person rainbowgoblin    schedule 23.05.2012    source источник


Ответы (2)


Вы нарушаете одно правило определения. Переместите определение в файл реализации:

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

Решение, на которое вы ссылаетесь, с extern, применяется к переменным, не являющимся членами. В вашем случае a - член класса.

person Luchian Grigore    schedule 23.05.2012

Вам следует удалить "const int A :: a [] = {1,2};" строка из заголовочного файла. Поместите эту строку определения в один из ваших файлов .cpp. Затем вы можете включать заголовочный файл несколько раз, когда он вам нужен.

person Xiaokun Zheng    schedule 23.05.2012