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

时间:2015-03-25 04:13:35

标签: c++

我现在已经阅读了一个小时的全局变量,我不能让我的工作。我有两个自定义类向量,Airport和Flight,它们在各自的头文件中定义。然后我在Glo.cals中声明了包含在main.cpp中的外部向量。如果我按原样保留代码,我会得到两个向量的“未解析的外部符号”错误:

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&gt;来创建矢量。机场,这是建议的。这由向量反映。

我项目中的代码如下。任何帮助将不胜感激。

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

2 个答案:

答案 0 :(得分:3)

extern vector<Airport> airports;

这是airports声明。它说&#34;程序中的某个地方是一个名为airports vector<Airport>&#34}的全局变量。

vector<Airport> airports;

这是airports定义。它创建一个名为airports的{​​{1}}类型的全局变量。您不能拥有两个具有相同名称的全局变量,即使它们位于不同的文件中也是如此。

您应该知道vector<Airport>有效地将所包含文件的全部内容复制粘贴到此文件中。因此,如果您将一个定义放在头文件中,并将该头文件包含在两个不同的源文件中,那么您有两个定义。

解决方案是将声明放在头文件(带#include)和一个源文件中的定义中。

答案 1 :(得分:1)

因为您没有 定义 。您只声明他们(extern仅声明)。

您需要在airports文件中添加flights.cpp的定义,如下所示:

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

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