как использовать вектор объектов в разных файлах

Как я могу получить доступ к статической векторной переменной в главном файле, который объявлен в заголовочном файле и заполнен в исходном файле. Фактический код немного велик, поэтому ниже приведен пример того, что я пробовал.

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
}

1

Решение

В вашем примере вы объявляете vec быть static, В этом контексте (глобальная / статическая переменная) это означает, что переменная должна существовать только в единице перевода (файл .cpp), где найдено объявление.

Так как вы положили это в файл .h и #includeВ нескольких исходных файлах оба файла .cpp будут иметь свои собственные static std::vector<a> vecвместо того, чтобы делиться тем же самым. Следовательно, возврат в один файл не влияет на вектор в другом.

Решение здесь состоит в том, чтобы удалить static из декларации vec и переместить его в один из cpp файлы.

Чтобы уточнить: положить объявление переменной в глобальный охват автоматически отдает статическая продолжительность хранения, что означает, что его время жизни заканчивается после main возвращается. С помощью extern означает, что вы указываете, что переменная была объявлена ​​в другом файле .cpp. Объявление глобальной переменной static только означает, что он не будет доступен в других файлах .cpp. Следовательно, если вы хотите использовать глобальную переменную в нескольких файлах .cpp, она должна быть разделена на одну без статических, и вы должны объявить ее как extern во всех других .cpp файлах, где он используется.

1

Другие решения

в классе.h:

extern std::vector<a> vec;

в source.cpp:

std::vector<a> vec;

в main.cpp: достаточно удалить объявление, включая class.h

0

Я бы поспорил против разделения векторов по единицам перевода, потому что я верю во избежание глобальных случаев, когда это возможно.

Вы можете сделать это, поместив вектор в класс вместе с populateVector() а также printVector() функции, а затем создать экземпляр этого класса в main и вызвать функции.

0
По вопросам рекламы [email protected]