1

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

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

主文件

#include "class.h"

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

3 回答 3

1

在您的示例中,您声明vecstatic. 在这种情况下(全局/静态变量),这意味着该变量应仅存在于找到声明的翻译单元(.cpp 文件)中。

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

这里的解决方案是static从声明中删除vec并将其移动到其中一个cpp文件中。

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

于 2013-11-08T10:29:59.540 回答
0

在 class.h 中:

extern std::vector<a> vec;

在 source.cpp 中:

std::vector<a> vec;

main.cpp中:去掉声明,包括class.h中就够了

于 2013-11-08T10:31:03.173 回答
0

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

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

于 2013-11-08T10:40:39.787 回答