2016-08-20 1 views
-2

ich eine txt-Datei, die ein Schelm artigen Ebene hat ich es wie so laden:Vektor <string> funktioniert nicht, wenn separate Klassen

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); 
} 
} 

Variablen:

string _level; 
vector<string> _level_instance; 

ich es ausdrucken wie folgt:

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

was gut funktioniert.

jedoch habe ich einen Vektor in einer anderen Klasse als auch und ich verwende einen Getter wie folgt aus:

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

und ich ändern, um die LoadLevel() von dieser:

_level_instance.push_back(_level); 

dazu:

Ich mache eine Methode in 'Level' Klasse, die es auf dem Bildschirm wie vorherausdrucktkompiliert es aber es gibt nichts aus, warum?

Durch die Art und Weise in den int main() neccesary Methoden ausgeführt werden, die OpenLevel() von File Klasse und Print() von Level Klasse

EDIT:

es & durch Bezugnahme funktionierte nicht vorbei hier sind beide Verfahren in Stufe. h:

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

in 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); 
} 


} 

es tut es funktionieren druckt nichts, obwohl ich ‚&‘ hinzugefügt das Ergebnis gleich ist, wenn ich es versuchen, mit ‚push_back‘ Methode in Level.h Hier ist int main() für alle Fälle:

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

Und PrintLevel() in Level.cpp:

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

Sie rufen 'f.LoadLevel();' aber die ' f 'weiß nichts über' lvl', das in 'main()' definiert ist, warum sollte also etwas innerhalb der '_level_data' in diesem' lvl' sein? Wo ist die offensichtlich andere Instanz 'lvl' in Ihrer' Datei' definiert? –

+0

@ t.niese, weil ich '_level_data' 's Wert in OpenLevel() gesetzt habe, indem ich GetLevelData() benutzt habe Pushback (_level) – belkipAndroidness

+0

In deiner 'main()' siehst du 'lvl' ist eine neue Instanz von' Level' das wird nirgends verwendet, also ruft 'lvl.PrintLevel' im Hauptfenster nichts auf, weil' _level_data' leer ist. –

Antwort

0

Die GetlevelData Funktion gibt seinen Vektor von Wert bedeutet, dass eine ganz neue Kopie davon erstellt wird. Alles, was Sie in diesen Vektor hineinschieben, geht verloren, wenn die Kopie den Gültigkeitsbereich verlässt (was passiert, wenn der Ausdruck fertig ist).

Sie sollten sie zurückkehren durch Verweis statt:

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

immer noch nicht funktioniert ..:/ – belkipAndroidness

+0

@belkipAndroidness Sie müssen ein [Minimal, vollständige und überprüfbare Beispiel] (http: // stackoverflow.com/help/mcve) und zeigen Sie uns. Bitte bearbeiten Sie Ihre Frage. –

0

vector<string>GetlevelData() gibt eine Kopie des Vektors und kein Hinweis auf sie.

So Ihre Lvl.GetLevelData().push_back(_level); gibt eine Kopie zurück fügt Daten zum Vektor und löscht dann diese Kopie erneut.Sie fügen es also einem Vektor hinzu, der sofort wieder gelöscht wird.

Sie müssten es zurückgeben entweder durch Verweis:

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

oder ein Verfahren, schreiben die Daten zurück zu drängen:

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

Warum muss es const sein? – belkipAndroidness

+0

@belkipAndroidness Das Übergeben von 'string' als Referenz vermeidet eine zusätzliche Kopie, aber dies würde es ermöglichen, die Zeichenfolge innerhalb von' push_back' zu ändern. Da Sie aber diese 'Zeichenfolge' nicht ändern wollen, fügen Sie eine' const' hinzu, so wie Sie oder woanders mit Ihrem Code, können Sie sicher sein, dass die 'Zeichenfolge' nicht geändert wird, wenn sie an die' 'übergeben wird push_back', ohne dass Sie nach der Definition Ihrer Methode suchen müssen. –

+0

danke für die Erklärung, aber beide Methoden scheinen nicht zu funktionieren:/ – belkipAndroidness

Verwandte Themen