【问题标题】:how can i use a vector in multiple .cpp and header files simultanously?如何同时在多个 .cpp 和头文件中使用向量?
【发布时间】:2013-04-03 16:54:57
【问题描述】:

我有一个 main.cpp 和一些类,每个类都定义在两个文件中:一个头文件和一个 .cpp 文件。 在 main.cpp 我有一个二维向量。我想在类的成员函数中使用这个向量。首先我尝试包含主文件,但我收到了重新定义错误。之后我尝试在另一个 .h 文件中定义向量。但这也没有用。 所以我应该怎么做才能在定义一些类时使用这个向量,这样它就可以保存成员函数所做的更改。

不幸的是,向量是全局的!

有关更多信息,此向量是游戏的棋盘。这个游戏有一些对象:怪物、人类、宝藏和一些陷阱。 该板在主要功能之前是全局定义的。 main.cpp 中有一些函数使用了这个板,我上面提到的 3 行中的类在其成员函数中使用了这个板。

是使用'extern'的解决方案吗?(我不知道它是什么,我只是在答案中看到它!-如果它是解决方案,我应该搜索一下。)

【问题讨论】:

  • 在您的 C/C++ 参考文档中查找 extern 关键字。也就是说,使用引用参数并忘记全局的概念,除非整个程序少于 25 行代码。
  • 这是一个全局变量(坏主意)吗? main() 或其他函数中的局部变量?如果我们要为您提供帮助,这类事情很重要。
  • 通过引用传递给相关函数。
  • @komeilshahhosseini:由于某种原因,您是否受限于全局向量?重新设计代码以使全局向量不再存在会是一个更好的主意;有关详细信息,请参阅我对以下答案之一的评论。
  • 这很公平。我仍然建议学习参考资料(它们并不像看起来那么可怕)并且这次设计正确,而不是练习一种糟糕的方法。

标签: c++


【解决方案1】:

Main.cpp

#include <vector>

std::vector<std::vector<int>> myArray;

int main(int argc, char **argv)
{
   // blah...
   myArray.add(5);
}

在你的其他文件中:

#include <vector>

extern std::vector<std::vector<int>> myArray;

使用 extern 关键字可以告诉编译器“嘿,这个对象就在这里,它不存在......但别担心!一旦链接器,你就会找到它组装编译的对象!”。

您也可以使用“extern”关键字来加载序列化数据(如bmp2c,它制作一个包含图片二进制数据的.c文件)

编辑:另外,两个对象具有完全相同的名称(区分大小写)也很重要。

【讨论】:

  • 通过使用 extern 我不再有任何错误,但是对向量所做的更改并没有保存在它上面,换句话说它根本没有改变!跨度>
  • 你的意思是当你关闭程序并重新打开它?这很正常,不应该。如果您希望它在更改矢量时保存矢量,则需要编写某种解析器,并手动读取/写入文件以加载/保存矢量。
【解决方案2】:

你可以这样写:

a.h

extern vector< vector<int> > vec2D; //declare the 2d vector here

a.cpp

#include "a.h"    
vector< vector<int> > vec2D;  //define the 2d vector here

ma​​in.cpp

#include "a.h"
//use the 2d vector here

【讨论】:

  • 那会工作。但值得指出的是,这并不是设计代码的好方法。最好将游戏板向量放入一个代表游戏的类中,然后将对该类实例的引用传递给需要与游戏交互的任何函数(或者,更好的是,定义编辑游戏作为游戏类的类方法。)
  • @Snail 正如我所说,我也想使用这个向量来定义一些类。当我包含定义向量的头文件时,出现错误:Error 18 error LNK2005: "class std::vector>,class std ::allocator > > board" (?board@@3V?$vector@V?$vector@DV?$allocator@D@std@@ @std@@V?$allocator@V?$vector@‌​DV?$allocator@D@std@@@std@@@2@@std@@A) 已经在 header.obj E:\lab 和python 编程\c++ 高级编程\main.obj 这个现在该怎么办?!!
猜你喜欢
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多