Несколько определений списка классов [duplicate]

6
задан mucisk 2 April 2013 в 14:47
поделиться

3 ответа

Включенные охранники предотвращают только несколько определений в пределах одной единицы перевода (т. е. одного исходного файла с включенными заголовками). Они не предотвращают множественные определения, когда вы включаете заголовок из нескольких исходных файлов.

Вместо этого у вас должно быть объявление в заголовке:

extern std::vector<Specs*> UcakSpecs;

и определение в одном (и только одном) исходном файле:

std::vector<Specs*> UcakSpecs;
8
ответ дан Mike Seymour 24 August 2018 в 18:35
поделиться

Защиты включения только предотвращают включение заголовка в одну и ту же единицу перевода более одного раза. Если вы включите этот заголовок в несколько единиц перевода, у вас будет несколько определений 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;
4
ответ дан Joseph Mansfield 24 August 2018 в 18:35
поделиться

#ifndef применяется только к одному модулю компиляции. Поскольку у вас есть две (основная функция и класс Ucak), переменная определяется дважды.

Рассмотрите объявление переменной как extern в файле заголовка:

extern std::vector<Specs*> UcakSpecs;

и определяя его внутри файла Ucak.cpp:

std::vector<Specs*> UcakSpecs;

Это должно работать.

3
ответ дан Rob I 24 August 2018 в 18:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: