繁体   English   中英

为什么我的全局变量导致问题?

[英]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文件中添加airportsflights的定义,如下所示:

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

此外, vector<Airport> airports; 不是前向声明,而是定义。 要转发声明变量,需要使用extern关键字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM