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

时间:2013-11-08 10:23:40

标签: c++ vector static extern modular-design

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

class.h

class a{

    private:
      int x;

    public:
      friend void createVec();
};

void createVec();
static std::vector<a> vec;

source.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
  }
}

的main.cpp

#include "class.h"

extern std::vector<a> vec;
int main()
{
  createVec();
  cout<<vec.size() //it prints 0 instead of 10  
}

3 个答案:

答案 0 :(得分:1)

在您的示例中,您声明vecstatic。在此上下文(全局/静态变量)中,这意味着变量应仅存在于发现声明的转换单元(.cpp文件)中。

由于您已将此文件放在.h文件中并且#include将其放在多个源文件中,因此两个.cpp文件都将拥有自己的static std::vector<a> vec,而不是共享相同的文件。因此,推回一个文件不会影响另一个文件中的向量。

此处的解决方案是从static的声明中删除vec,并将其移至cpp个文件之一。

澄清一下:将变量声明置于全局范围会自动赋予静态存储持续时间,这意味着它的生命周期在main返回后结束。使用extern表示您指定该变量已在另一个.cpp文件中声明。声明全局变量static仅表示它在其他.cpp文件中不可用。因此,如果你想在多个.cpp文件中使用一个全局变量,它应该在一个文件中被声明,而不是静态的,你应该在使用它的所有其他.cpp文件中将它声明为extern

答案 1 :(得分:0)

在class.h中

extern std::vector<a> vec;
source.cpp中的

std::vector<a> vec;
main.cpp中的

:删除声明,包括class.h中的

答案 2 :(得分:0)

我反对在翻译单元上共享向量,因为我相信尽可能避免全局实例。

您可以通过将向量与populateVector()printVector()函数一起放在类中来实现,然后在main中实例化该类并调用函数。