Как я могу получить доступ к статической векторной переменной в главном файле, который объявлен в заголовочном файле и заполнен в исходном файле. Фактический код немного велик, поэтому ниже приведен пример того, что я пробовал.
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
}
В вашем примере вы объявляете vec
быть static
, В этом контексте (глобальная / статическая переменная) это означает, что переменная должна существовать только в единице перевода (файл .cpp), где найдено объявление.
Так как вы положили это в файл .h и #include
В нескольких исходных файлах оба файла .cpp будут иметь свои собственные static std::vector<a> vec
вместо того, чтобы делиться тем же самым. Следовательно, возврат в один файл не влияет на вектор в другом.
Решение здесь состоит в том, чтобы удалить static
из декларации vec
и переместить его в один из cpp
файлы.
Чтобы уточнить: положить объявление переменной в глобальный охват автоматически отдает статическая продолжительность хранения, что означает, что его время жизни заканчивается после main
возвращается. С помощью extern
означает, что вы указываете, что переменная была объявлена в другом файле .cpp. Объявление глобальной переменной static
только означает, что он не будет доступен в других файлах .cpp. Следовательно, если вы хотите использовать глобальную переменную в нескольких файлах .cpp, она должна быть разделена на одну без статических, и вы должны объявить ее как extern
во всех других .cpp файлах, где он используется.
в классе.h:
extern std::vector<a> vec;
в source.cpp:
std::vector<a> vec;
в main.cpp: достаточно удалить объявление, включая class.h
Я бы поспорил против разделения векторов по единицам перевода, потому что я верю во избежание глобальных случаев, когда это возможно.
Вы можете сделать это, поместив вектор в класс вместе с populateVector()
а также printVector()
функции, а затем создать экземпляр этого класса в main и вызвать функции.