问题描述
|
在有人叫我不考虑先前存在的问题之前,我已经看过并意识到这与声明有关,但是我仍然无法使它起作用(可能与使用向量的方式有关)。
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,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:
未解析的外部符号“专用”:
静态结构向量
经理::机场\“
(?airports @ Manager @@ 0U?$ Vector @ UAirport @@@@@ A)
Manager.obj:错误LNK2001:
未解析的外部符号“专用”:
静态结构向量
经理::机票\“
(?flights @ Manager @@ 0U?$ Vector @ 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;
请参见为什么具有静态数据成员的类会出现链接器错误?从C ++常见问题解答中获取。
,奥利(Oli)和康斯坦丁纽斯(Constantinius)已经回答了您的实际问题,但我建议您更改课程。就目前而言,它仅具有静态成员,因此您永远无法创建此类的对象。尽管这是合法的C ++,但它并不符合C ++的精神(尽管确实有其他语言支持这种用法,例如C#)
所有静态成员都暗示您正在尝试某种单例,但是有更多标准的方法来增强类的单例性。
话虽这么说-我主张永远不要将单身性建设成一个阶级。而是将该类编写为普通类,并提供单例包装器。这还具有防止您的当前代码易于陷入的臭名昭著的静态初始化顺序失败的整洁副作用。
因此,类似的内容(为简洁起见,不包括):
经理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::Manager()
{
loadAirports();
loadFlights();
}
Manager& GetManager()
{
static Manager manager;
return manager;
}