2011-05-26 137 views
16

在任何人打电话给我不查看以前存在的问题之前,我已经看到并意识到它是与声明有关,但我仍然无法实现它的功能(可能与我使用矢量有关)。C++矢量问题 - '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 : error LNK2001: unresolved external symbol "private: static struct Vector Manager::airports" ([email protected]@@[email protected]@@@@A)

Manager.obj : error LNK2001: unresolved external symbol "private: static struct Vector Manager::flights" ([email protected]@@[email protected]@@@@A)

我意识到我需要定义的载体,但如何和哪里?我试图创建一个空的构造函数,然后做

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

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

回答

30

你必须在.cpp文件来定义他们:

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

它们为什么是而不是? – conterio 2015-07-17 21:37:40

23

在您的.cpp文件,你需要添加定义静态变量的

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

Why are classes with static data members getting linker errors?从C++ FAQ。

+0

哦,我不知道它不得不到外面去任何类型的函数或构造函数。 – oliverw92 2011-05-26 14:52:22

+1

只有一个静态实例,所以不需要构造函数。这很像你声明/定义全局变量的方式。例如。在头文件中:'extern int count;'和源文件中:'int count = 0;'。 (还要注意'static'具有各种不同的含义,取决于你在哪里找到它。) – 2011-05-26 14:57:49

5

奥利和Constantinius回答您的实际问题,但我会建议改变类。按照它的规定,它只有静态成员,所以你永远不能创建这个类的对象。尽管这是合法的C++,但它并不符合C++的精神(尽管还有其他语言也支持这种用法,例如C#)

所有静态成员都暗示您正在尝试使用某种单例,但在那里是更强化班级单身性的标准方式。

话虽如此 - 我主张从来没有建设单身一类。而是将该类写成普通类,并提供单例包装器。这也具有防止臭名昭着的静态初始化命令失败的副作用,您的当前代码可能会遇到。

因此,像(不包括包括简洁):

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

哦 - 还有一个单独的旁注 - 如果您使用'std :: set '或'std :: map '而不是'std :: vector ',则可以避免在'getAirport'中进行线性搜索。 – 2011-05-26 15:08:35

相关问题