C ++ vector问题 - 'LNK2001:未解析的外部符号private:static ...'

时间:2011-05-26 14:48:31

标签: c++

在没有看到预先存在的问题之前有人打电话给我之前,我已经看到并意识到它与声明有关,但我仍然无法使它工作(可能与我使用向量有关)。

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:   未解决的外部符号“私人:   static struct Vector   管理::机场”   (?机场@ @@经理0U?$矢量@ UAirport @@@@ A)

     

Manager.obj:错误LNK2001:   未解决的外部符号“私人:   static struct Vector   管理::航班”   (?航班@ @@经理0U?$矢量@ UFlight @@@@ A)

我意识到我需要定义向量,但是如何以及在哪里?我尝试创建一个空构造函数,然后执行

Manager::Manager ()
{
    vector<string> flights;
    vector<string> airports;
}

但它只是给了我一个重新定义错误。

3 个答案:

答案 0 :(得分:33)

您必须在.cpp文件中定义它们:

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

答案 1 :(得分:24)

在.cpp文件中,您需要添加静态变量的 definitions

vector<Airport> Manager::airports;
vector<Flight> Manager::flights;

请参阅C ++常见问题解答中的Why are classes with static data members getting linker errors?

答案 2 :(得分:5)

Oli和Constantinius已经回答了你的实际问题,但我建议你改变课程。因为它只有静态成员,所以你永远不能创建这个类的对象。虽然这是合法的C ++,但它不符合C ++的精神(虽然有其他语言可以包含这种用法,例如C#)

所有静态成员都暗示你正在尝试使用某种单例,但是有更多标准方法可以强制执行类的单例。

话虽如此 - 我提倡永远不会将singleton-ness 构建到类中。而是将类写为普通类,并提供单例包装器。这也具有防止臭名昭着的静态初始化命令惨败的整洁副作用,使您当前的代码容易陷入其中。

所以,类似的东西(不包括简洁的包含):

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