如何在不同的文件中使用对象的向量

how to use vector of objects in different files

本文关键字:对象 向量 文件      更新时间:2023-10-16

如何访问主文件中的静态向量变量,该变量在头文件中声明并填充在源文件中。实际代码有点大,所以下面是我尝试过的一个例子。

类.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 中实例化该类并调用函数来实现这一点。