如何在不同的文件中使用对象的向量
how to use vector of objects in different files
如何访问主文件中的静态向量变量,该变量在头文件中声明并填充在源文件中。实际代码有点大,所以下面是我尝试过的一个例子。
类.h
class a{
private:
int x;
public:
friend void createVec();
};
void createVec();
static std::vector<a> vec;
来源.cpp
include"class.h"
extern std::vector<a> vec; //if i remove this line code runs and don't show any error
// -of undefined variable
void createVec()
{
for(int i=0; i<9; i++)
{
vec.push_back(i); //while debugging and watching vec, code is able to populate vec
//but i doubt whether is it vector declared in class.h or not
}
}
主.cpp
#include "class.h"
extern std::vector<a> vec;
int main()
{
createVec();
cout<<vec.size() //it prints 0 instead of 10
}
在您的示例中,您声明vec
static
。在此上下文(全局/静态变量)中,这意味着该变量应仅存在于找到声明的翻译单元(.cpp文件)中。
由于您已将其放入 .h 文件中并#include
在多个源文件中执行此操作,因此这两个.cpp文件都有自己的static std::vector<a> vec
,而不是共享同一个文件。因此,在一个文件中向后推不会影响另一个文件中的向量。
此处的解决方案是从vec
声明中删除static
并将其移动到其中一个cpp
文件中。
澄清一下:将变量的声明放在全局范围内会自动为其提供静态存储持续时间,这意味着其生命周期在main
返回后结束。使用 extern
意味着指定已在另一个 .cpp 文件中声明该变量。声明全局变量static
仅意味着它在其他.cpp文件中不可用。因此,如果要在多个.cpp文件中使用全局变量,则应将其分解为一个,而不使用静态变量,并且应在使用它的所有其他.cpp文件中将其声明为extern
。
in class.h:
extern std::vector<a> vec;
在源代码中.cpp:
std::vector<a> vec;
在 main.cpp:删除声明,包括 class.h 在足够
我反对在翻译单元上共享向量,因为我相信尽可能避免全局实例。
您可以通过将向量与 populateVector()
和 printVector()
函数一起放在一个类中,然后在 main 中实例化该类并调用函数来实现这一点。
相关文章:
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 从多个源构造一个对象,包括一个对象向量
- 如何从文件中读取两个字符串和数字数组,并将它们存储在对象向量中
- 对象 C++ 向量的 STL 容器
- 初始化C++中的对象向量
- 从自定义类获取对象向量中的 max 元素
- 如何在 c++ 中打印存档中的对象向量
- 如何将包含另一个对象向量的对象保存到文件中,并使用C++中的二进制文件从文件中读回?
- 尝试重载输出运算符时,我无法遍历对象向量
- 如何在C++中打印对象向量的内容
- 打印出对象向量中的每个元素C++
- 在 c++ 的构造函数中分配对象向量时出错
- 遍历对象向量,并找到与从文本文件中提取的对象匹配的变量
- 对象向量是否在堆或堆栈上分配C++?
- 基于不同字段的对象向量的排序功能
- 有没有一种简单的方法可以在对象向量上调用构造函数?
- 用rapidjson读取子对象向量
- 尝试使用比较运算符对对象向量进行排序
- 如何用对象向量重载 cin(>>)
- 如何将某个元素从shared_ptr擦除到对象向量?