Ответ 1
Вы должны определить их в файле .cpp
:
vector<string> Manager::flights;
vector<string> Manager::airports;
Прежде чем кто-нибудь вызовет меня, не глядя на ранее существовавшие вопросы, я посмотрел и понял, что это связано с объявлением, но я все еще не могу заставить его работать (может быть, что-то делать со мной, используя векторы).
Manager.h:
#include "Flight.h"
#ifndef manager_h
#define manager_h
class Manager {
static vector<Airport> airports;
static vector<Flight> flights;
public:
static void loadAirports();
static void loadFlights();
static Airport getAirport(string code);
static vector<string> split(const string &s, vector<string> &elems);
};
#endif
Manager.cpp:
#include "Manager.h"
void Manager::loadAirports ()
{
ifstream airportfile("airports.txt");
string line;
while (getline(airportfile, line))
{
vector<string> values;
split(line, values);
Airport airport (values[0], values[1], atoi(values[2].c_str()));
airports.push_back(airport);
}
}
void Manager::loadFlights ()
{
ifstream flightfile("flights.txt");
string line;
while (getline(flightfile, line))
{
vector<string> values;
split(line, values);
Flight flight (getAirport(values[0]), getAirport(values[1]), atoi(values[2].c_str()), atoi(values[3].c_str()));
flights.push_back(flight);
}
cout << flights.size() << endl;
}
Airport Manager::getAirport (string code)
{
for (int i = 1; i < (int)airports.size(); i++)
{
if (airports[i].code == code)
return airports[i];
}
throw exception();
}
vector<string> Manager::split(const string &s, vector<string> &elems) {
stringstream ss(s);
string item;
while(getline(ss, item, ',')) {
elems.push_back(item);
}
return elems;
}
Это ошибка:
Manager.obj: ошибка LNK2001: неразрешенный внешний символ "частный: статическая структура Вектор Менеджер:: аэропортов" (? Аэропортов @Диспетчере @@0U? $Вектор @UAirport @@@@A)
Manager.obj: ошибка LNK2001: неразрешенный внешний символ "частный: статическая структура Вектор Менеджер:: полеты" (? Рейсы @Диспетчере @@0U? $Вектор @UFlight @@@@A)
Я понимаю, что мне нужно определить векторы, но как и где? Я попытался создать пустой конструктор, а затем выполнил
Manager::Manager ()
{
vector<string> flights;
vector<string> airports;
}
Но это просто дало мне ошибку переопределения.
Вы должны определить их в файле .cpp
:
vector<string> Manager::flights;
vector<string> Manager::airports;
В вашем .cpp файле вам нужно добавить определения статических переменных:
vector<Airport> Manager::airports;
vector<Flight> Manager::flights;
См. Почему классы со статическими элементами данных получают ошибки компоновщика? из часто задаваемых вопросов по С++.
Оли и Константиний ответили на ваш реальный вопрос, но я бы рекомендовал изменить класс. Как бы то ни было, он имеет только статические элементы, поэтому вы никогда не сможете создать объект этого класса. Хотя это законный С++, это не в духе С++ (хотя есть другие языки, которые охватывают это использование, например С#)
Все статические члены подразумевают, что вы пытаетесь использовать какой-то одноэлементный режим, но есть более стандартные способы принудительного применения одноэлементности класса.
Сказав это - я сторонник никогда не строит одноэлементность в класс. Скорее напишите класс как обычный класс и предоставьте обертку singleton. У этого также есть аккуратный побочный эффект, предотвращающий пресловутый фиаско порядка статического инициализации, с которым ваш текущий код может столкнуться.
Итак, что-то вроде (за исключением включений для краткости):
Manager.h
class Manager {
vector<Airport> airports;
vector<Flight> flights;
public:
Manager();
void loadAirports();
void loadFlights();
Airport getAirport(string code);
vector<string> split(const string &s, vector<string> &elems);
};
Manager& GetManager();
Manager.cpp
Manager::Manager()
{
loadAirports();
loadFlights();
}
Manager& GetManager()
{
static Manager manager;
return manager;
}