[英]Why is my global variable causing problems?
我已经阅读了一个小时的全局变量,但是我无法正常工作。 我有两个自定义类向量,分别是Airport和Flight,它们在各自的头文件中定义。 然后,我在main.cpp中包含的Globals.h标头中声明外部向量。 如果我按原样保留代码,则两个向量都将收到“未解析的外部符号”错误:
error LNK2001: unresolved external symbol "class std::vector<class Airport,class std::allocator<class Airport> > airports" (?airports@@3V?$vector@VAirport@@V?$allocator@VAirport@@@std@@@std@@A)
error LNK2001: unresolved external symbol "class std::vector<class Flight,class std::allocator<class Flight> > flights" (?flights@@3V?$vector@VFlight@@V?$allocator@VFlight@@@std@@@std@@A)
相反,如果我通过以下方式声明(例如,我被认为是应该这样做的话):
vector<Airport> airports;
vector<Flight> flights;
在main()前面,然后出现以下错误:
error C2371: 'airports' : redefinition; different basic types
error C2371: 'flights' : redefinition; different basic types
还有关于向量中分配器的错误,以及一个向量与另一个向量不相等的方式。 但是,我不能通过输入vector> airport来创建矢量,这是建议的。 这是通过向量镜像的。
我项目中的代码如下。 任何帮助,将不胜感激。
main.cpp (简体):
#include "stdafx.h"
#include "Globals.h"
using namespace std;
int main(){
airports = readInAirports();//returns a vector<Airport>
flights = readInFlights();//returns a vector<Flight>
}
Airport.h :( Flight.h是类似的)
#ifndef AIRPORT_H
#define AIRPORT_H
#include <vector>
#include <string>
using namespace std;
class Airport{
public:
Airport(string c, string n, int dt, int cc)
:code(c), name(n),
departureTax(dt),connectionTime(cc)
{}
string toLine();
string getCode();
string getName();
int getDepTax();
int getConnTime();
private:
string code, name;
int departureTax, connectionTime;
};
#endif
Globals.h :
#ifndef GLOBALS_H
#define GLOBALS_H
#include <vector>
#include <string>
#include <math.h>
#include "Airport.h"
#include "Flight.h"
extern vector<Airport> airports;
extern vector<Flight> flights;
#endif
extern vector<Airport> airports;
这是airports
的声明 。 它说:“程序中的某个地方是一个称为vector<Airport>
类型的airports
的全局变量”。
vector<Airport> airports;
这是airports
的定义 。 它创建一个名为vector<Airport>
类型的airports
的全局变量。 即使两个全局变量位于不同的文件中,也不能具有相同的名称。
您应该知道#include
有效地将包含文件的全部内容复制粘贴到此文件中。 因此,如果将定义放在头文件中,并将该头文件包含在两个不同的源文件中,那么您将有两个定义。
解决方案是将声明放在头文件(带有extern
)中,并将定义放在一个源文件中。
因为您尚未定义它们。 您只声明了它们( extern
仅声明了)。
您需要在.cpp
文件中添加airports
和flights
的定义,如下所示:
vector<Airport> airports;
vector<Flight> flights;
此外, vector<Airport> airports;
不是前向声明,而是定义。 要转发声明变量,您需要使用extern
关键字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.