Подтвердить что ты не робот

С++ vector issue - 'LNK2001: неразрешенный внешний символ private: static...'

Прежде чем кто-нибудь вызовет меня, не глядя на ранее существовавшие вопросы, я посмотрел и понял, что это связано с объявлением, но я все еще не могу заставить его работать (может быть, что-то делать со мной, используя векторы).

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;
}

Но это просто дало мне ошибку переопределения.

4b9b3361

Ответ 1

Вы должны определить их в файле .cpp:

vector<string> Manager::flights;
vector<string> Manager::airports;

Ответ 3

Оли и Константиний ответили на ваш реальный вопрос, но я бы рекомендовал изменить класс. Как бы то ни было, он имеет только статические элементы, поэтому вы никогда не сможете создать объект этого класса. Хотя это законный С++, это не в духе С++ (хотя есть другие языки, которые охватывают это использование, например С#)

Все статические члены подразумевают, что вы пытаетесь использовать какой-то одноэлементный режим, но есть более стандартные способы принудительного применения одноэлементности класса.

Сказав это - я сторонник никогда не строит одноэлементность в класс. Скорее напишите класс как обычный класс и предоставьте обертку 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;
}