我现在已经阅读了一个小时的全局变量,我不能让我的工作。我有两个自定义类向量,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
答案 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
关键字。