2011-05-26 132 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

相關問題