Включенные охранники предотвращают только несколько определений в пределах одной единицы перевода (т. е. одного исходного файла с включенными заголовками). Они не предотвращают множественные определения, когда вы включаете заголовок из нескольких исходных файлов.
Вместо этого у вас должно быть объявление в заголовке:
extern std::vector<Specs*> UcakSpecs;
и определение в одном (и только одном) исходном файле:
std::vector<Specs*> UcakSpecs;
Защиты включения только предотвращают включение заголовка в одну и ту же единицу перевода более одного раза. Если вы включите этот заголовок в несколько единиц перевода, у вас будет несколько определений UcakSpecs
в программе.
Способ объявления глобальной переменной состоит в том, чтобы объявить его как extern
в файле заголовка:
#ifndef USPECS_H
#define USPECS_H
#inclde "Specs.h"
#include <iostream>
#include <vector>
extern std::vector<Specs*> UcakSpecs;
#endif
Глобальная переменная, объявленная как extern
, является только объявлением.
Затем убедитесь, что она определена только в одной единицы перевода, определяя ее в файле реализации ( возможно, в USpecs.cpp
);
std::vector<Specs*> UcakSpecs;
#ifndef
применяется только к одному модулю компиляции. Поскольку у вас есть две (основная функция и класс Ucak
), переменная определяется дважды.
Рассмотрите объявление переменной как extern
в файле заголовка:
extern std::vector<Specs*> UcakSpecs;
и определяя его внутри файла Ucak.cpp
:
std::vector<Specs*> UcakSpecs;
Это должно работать.