2013-04-03 4 views
0

У меня есть main.cpp и некоторые классы, каждый из которых определяется в двух файлах: заголовок и .cpp-файл. в main.cpp у меня есть 2d вектор. Я хочу использовать этот вектор в функциях-членах классов. Сначала я попытался включить основной файл, но получил ошибку переопределения. после этого я попытался определить вектор в другом файле .h. но это тоже не сработало. , так что я должен сделать, чтобы использовать этот вектор в определении некоторых классов, тем самым, чтобы он мог сохранить изменения, внесенные в функции-члены.Как я могу использовать вектор в нескольких файлах .cpp и заголовках одновременно?

К сожалению, этот вектор глобальный!

для получения дополнительной информации этот вектор является доской игры. в этой игре есть несколько объектов: монстр, человек, сокровище и некоторые ловушки. плата определяется глобально перед основной функцией. в main.cpp есть некоторые функции, которые используют эту доску, а классы, которые я упомянул выше в 3 строках, используют эту плату в своих функциях-членах.

является решение с использованием «Экстерн»? (Я не знаю, что это такое, я только что видел его в ответах! -если это решение, я должен искать об этом.)

+1

Взгляд вверх 'extern' ключевого слова в вашем C/C++ справочной документации Тем не менее, использовать ссылочный параметр и забудьте об идее глобального, если эта целая программа меньше, чем около 25 строк кода. – WhozCraig

+0

Является ли это глобальной переменной (плохая идея)? Локальная переменная в main() или некоторая другая функция ? Такие вещи важны, если мы хотим вам помочь. –

+2

Передайте его по ссылке в соответствующие функции. – Pubby

ответ

0

main.cpp

#include <vector> 

std::vector<std::vector<int>> myArray; 

int main(int argc, char **argv) 
{ 
    // blah... 
    myArray.add(5); 
} 

и в вашем другом файле:

#include <vector> 

extern std::vector<std::vector<int>> myArray; 

используя Экстерн ключевое слово позволяет указать компилятору " Эй, этот объект прямо здесь, его не существует ... Но не волнуйся! Вы найдете его, как только компоновщик собирает скомпилированные объекты!».

Вы можете также использовать„ехЬегп“ключевое слово, чтобы загрузить данные в последовательных форме (например, bmp2c, что делает .c файл, содержащий двоичные данные Изображенных)

EDIT:.. Кроме того, важно, что 2 объекта имеет точно такое же имя (чувствительно к регистру)

+0

с помощью extern i больше не имеют никакой ошибки, но изменения, которые сделаны для вектора, не сохраняются на нем, другими словами, он не изменяется вообще! –

+0

Вы имеете в виду, когда вы закрываете программу и повторно открываете ее? Это нормально, не должно. Если вы хотите, чтобы он сохранил ваш вектор при его изменении, вам нужно написать какой-то парсер и вручную прочитать/записать файл для загрузки/сохранения вектора. – SsJVasto

0

Вы можете написать его как это:

ах

extern vector< vector<int> > vec2D; //declare the 2d vector here 

a.cpp

#include "a.h"  
vector< vector<int> > vec2D; //define the 2d vector here 

main.cpp

#include "a.h" 
//use the 2d vector here 
+2

Это будет * работа *. Но стоит отметить, что это не очень хороший способ разработки кода. Гораздо лучше поместить вектор игрового поля в класс, который представляет игру, а затем передать ссылку на экземпляр этого класса вокруг любой функции, которая должна взаимодействовать с игрой (или, что еще лучше, определить функции, которые редактируют игра как классные методы игрового класса.) – drewmm

+0

О, да! Ты прав. – Snail

+0

@Snail \t Как я уже сказал, я хочу использовать этот вектор и в определении некоторых классов. когда я включаю заголовочный файл, в котором вектор определен, я получаю сообщение об ошибке: Ошибка 18 ошибка LNK2005: «class std :: vector >, class std :: allocator >>> доска "(? board @@ 3V? $ vector @ V? $ vector @ DV? $ allocator @ D @ std @@@ std @@ V? $ Allocator @ V? $ Vector @ DV? $ Allocator @ D @ std @@@ std @@@ 2 @@ std @@ A), уже определенный в header.obj E: \ lab и программирование на языке python \ C++ продвинутое программирование \ main.obj, что я должен делать с этим сейчас? !! –

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