2013-11-08 2 views
1

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

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

Как и во многих файлах, вы использовали бы экземпляр любого другого типа. 'std :: vector' не является магии в этом отношении. – juanchopanza

+0

@juanchopanza, но главный файл не имеет доступа к 'vec' – Rahul

+0

Дело в том, что' std :: vector' не отличается от 'int' или любого другого типа в этом контексте. – juanchopanza

ответ

1

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

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

Решение здесь должно удалить static из объявления vec и переместить его в один из файлов cpp.

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

+0

благодарит за ответ и объясняет концепцию 'оба файла .cpp будут иметь свой собственный статический std :: vector vec'.Как вы объяснили, нет необходимости использовать 'static', поэтому объявление переменной' extern' делает ее доступной из жизни программы? – Rahul

+0

@Rahul Действительно, вам не нужно использовать 'static'. Но вы должны объявить его (без 'static' и без' extern') в одном из .cpp-файлов. Объявив его как «extern» в других .cpp-файлах, вы можете использовать его в этом файле, заявив, что он существует, но объявлен в другом .cpp-файле. – Agentlien

+0

@Rahul Все переменные, которые являются глобальными (не объявлены в функции или классе), имеют статическую продолжительность хранения, а это означает, что они доступны на протяжении всей программы (точнее, до тех пор, пока вы не достигнете конца 'main'). – Agentlien

0

в class.h:

extern std::vector<a> vec; 

в source.cpp:

std::vector<a> vec; 

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

+0

спасибо, что ответ он сработал – Rahul

0

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

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

Смежные вопросы