如何在主文件中访问静态向量变量,该变量在头文件中声明并填充在源文件中。实际代码有点大,所以下面是我试过的一个例子。
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
}
答案 0 :(得分:1)
在您的示例中,您声明vec
为static
。在此上下文(全局/静态变量)中,这意味着变量应仅存在于发现声明的转换单元(.cpp文件)中。
由于您已将此文件放在.h文件中并且#include
将其放在多个源文件中,因此两个.cpp文件都将拥有自己的static std::vector<a> vec
,而不是共享相同的文件。因此,推回一个文件不会影响另一个文件中的向量。
此处的解决方案是从static
的声明中删除vec
,并将其移至cpp
个文件之一。
澄清一下:将变量声明置于全局范围会自动赋予静态存储持续时间,这意味着它的生命周期在main
返回后结束。使用extern
表示您指定该变量已在另一个.cpp文件中声明。声明全局变量static
仅表示它在其他.cpp文件中不可用。因此,如果你想在多个.cpp文件中使用一个全局变量,它应该在一个文件中被声明,而不是静态的,你应该在使用它的所有其他.cpp文件中将它声明为extern
。
答案 1 :(得分:0)
:
extern std::vector<a> vec;
source.cpp中的:
std::vector<a> vec;
main.cpp中的:删除声明,包括class.h中的
答案 2 :(得分:0)
我反对在翻译单元上共享向量,因为我相信尽可能避免全局实例。
您可以通过将向量与populateVector()
和printVector()
函数一起放在类中来实现,然后在main中实例化该类并调用函数。