2016-08-20 2 views
-2

У меня есть текстовый файл, который имеет поддельный подобный уровень я загрузить его следующим образ:вектор <string> не работает при использовании раздельных классов

void File::LoadLevel() 
{ 

ifstream input_file; 
input_file.open("Level_1.txt"); 
if (input_file.fail()) 
{ 
    perror("Level_1.txt"); 
} 
while (input_file >> _level) 
{ 
    _level_instance.push_back(_level); 
} 
} 

переменных:

string _level; 
vector<string> _level_instance; 

Я распечатать его например:

for (int i = 0; i < _level_instance.size(); i++) 
{ 
    cout << _level_instance[i] << endl; 
} 

который отлично работает.

однако у меня есть вектор в другом классе, а также и я использовать поглотитель так:

vector<string>GetlevelData(){ return _level_data; } 

и изменить LoadLevel() из этого:

_level_instance.push_back(_level); 

к этому:

Level Lvl; 
    Lvl.GetLevelData().pushback(_level); 

Я делаю метод в классе «Уровень», который печатает его на экране так же, как раньше компилируется, но ничего не распечатывает?

Кстати в int main() neccesary методы выполняются который OpenLevel() из File класса и Print() от Level класса

EDIT:

передавая его & ссылочной Didnt работы здесь являются методы уровня. ч:

void SetLevelData(const std::string &string) { 
    _level_data.push_back(string); 
} 
//Getters 
vector<string>& GetlevelData(){ return _level_data; } 

в file.cpp:

void File::LoadLevel() 
{ 

ifstream input_file; 
Level lvl; 
input_file.open("Level_1.txt"); 
if (input_file.fail()) 
{ 
    perror("Level_1.txt"); 
} 
while (input_file >> _level) 
{ 
    lvl.GetlevelData().push_back(_level); 
} 


} 

он не работает это ничего не печатает, хотя я добавил «&» результат такой же, когда я попробовать его с помощью метода «push_back» в Level.h Здесь есть ИНТ основной() только в случае, если:

int main() 
{ 
File f; 
Level lvl; 
f.LoadLevel(); 
lvl.PrintLevel(); 
system("PAUSE"); 
return 0; 
} 

И PrintLevel() в Level.cpp:

void Level::PrintLevel() 
{ 
for (int i = 0; i < _level_data.size(); i++) 
{ 
    cout << _level_data[i] << endl; 
} 
} 
+0

Вы называете 'f.LoadLevel();' а ' f' ничего не знает о 'lvl', определенном в' main() ', так почему же должно быть что-то внутри' _level_data', находящегося внутри этого 'lvl'? Где находится явно различный экземпляр 'lvl' внутри вашего' File'? –

+0

@ t.niese, потому что я установил значение «_level_data» в OpenLevel() с помощью GetLevelData(). Pushback (_level) – belkipAndroidness

+0

В вашем 'main()' вы показываете здесь 'lvl' - это новый экземпляр' Level' который не используется нигде, поэтому вызов 'lvl.PrintLevel' в основном не будет отображаться, потому что его' _level_data' пуст. –

ответ

0

GetlevelData функция возвращает вектор по значению, что означает, что создается совершенно новая его копия. Все, что вы нажимаете на этот вектор, будет потеряно, когда копия выходит за рамки (что происходит, когда выполняется выражение Lvl.GetLevelData().pushback(_level)).

Вы должны вернуть его по ссылке вместо:

vector<string>& GetlevelData(){ return _level_data; } 
//   ^
//   | 
// Return by reference 
+0

все еще не работает ..:/ – belkipAndroidness

+0

@belkipAndroidness Вам нужно создать [Минимальный, полный и проверенный пример] (http: // stackoverflow.com/help/mcve) и показать нам. Пожалуйста, отредактируйте свой вопрос. –

0

vector<string>GetlevelData() возвращает копию вектора, а не ссылку на него.

Таким образом, ваш Lvl.GetLevelData().push_back(_level); возвращает копию, добавляет данные в вектор, а затем удаляет эту копию еще раз.Поэтому вы добавляете его к вектору, который будет немедленно удален.

Вы должны вернуть его либо по ссылке:

vector<string>& GetlevelData(){ return _level_data; } 

Или написать метод, чтобы оттеснить данные:

void push_back(const std::string &string) { 
    _level_data.push_back(string); 
} 
+0

Почему это должно быть const? – belkipAndroidness

+0

@belkipAndroidness Передача 'string' в качестве ссылки позволяет избежать дополнительной копии, но это позволит вам изменить строку внутри вас' push_back'. Но поскольку вы не хотите изменять эту «строку» там, вы добавляете 'const', так, как вы или где-то еще используете свой код, можете быть уверены, что' string' не изменяется, когда он передается в ' push_back', без необходимости заглядывать в определение вашего метода. –

+0

спасибо за объяснение, но оба метода, похоже, не работают:/ – belkipAndroidness

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