Vector scheint "read-only" zu sein??
-
Hallo Leute,
Ein Kumpel und ich fangen gerade mit C++ an und haben ein Problem mit den Vectoren. Die Situation ist folgende:
Wir haben eine Klasse "creature", die ein element "position" enthält.
position ist auch eine Klasse und enthält eine X und eine Y Koordinate.
Jetzt wird von der creature die klasse "monster" abgeleitet, wo noch ein paar Werte wie Schaden, Erfahrung usw. hinzugefügt werden.
Jetzt kommt der Vector ins Spiel:
Wir machen einen Vector von Monstern mit folgendem Befehl:
std::vector<monster> MonsterListe;Der sollte ja jetzt leer sein.
Jetzt fügen wir eine Instanz von Monster, "Spider" ein, indem wir schreiben:Spider(10,leere_position,10,10) // ein paar Werte eben, wichtig ist nur die Position MonsterListe.push_back(Spider);Nun wollen wir nachträglich die Position der Spinne verändern und schreiben:
MonsterListe(j).position = neue_position;Die Zuweisung funktioniert, wir haben da eine Ausgabe drin, aber wenn wir danach die Position der Spinne ausgeben, hat sie sich nicht verändert!
Wir haben das dann auch mit anderen Werten probiert und es scheint, dass wir die Variablen der Spinne im Vector nicht verändern können, sobald sie erstmal initialisiert wurden. Man kann zwar eine neue Spinne mit beliebigen Werten eintragen, aber eine bestehende ist nicht veränderbar!
Was machen wir falsch?
Ich hoffe ihr könnt uns helfen,
Vielen Dank im Voraus.
-
Wir haben das Problem identifiziert: Es hat mit dem Vector nichts zu tun.
Unsere "get" Funktionen geben eine Kopie zurück, die wir dann verändert haben, so dass die Änderung im Original nicht gespeichert wurde.
Wir haben jetzt alles mit Pointern geregelt, so dass alle "get" Funktionen Pointer auf ihre jeweiligen Objekte zurückgeben, aber da gibt es ein Problem mit dem wir nicht fertig werden:
Wir wollen mit folgender Zeile einem Objekt "Monster" eine neue Position zuweisen:
get_monsterPtr(j)->get_positionPtr() = temp_pos;Da kriegen wir aber einen Fehler:
error: non - lvalue in assignmentWir vermuten dass wir einen Zuweisungsoperator brauchen, aber wie machen wir den und für welches der beiden Objekte? Ich hoffe ihr wisst Hilfe,
theVector
-
theVector schrieb:
Wir haben jetzt alles mit Pointern geregelt, so dass alle "get" Funktionen Pointer auf ihre jeweiligen Objekte zurückgeben, aber da gibt es ein Problem mit dem wir nicht fertig werden:
Wir wollen mit folgender Zeile einem Objekt "Monster" eine neue Position zuweisen:
get_monsterPtr(j)->get_positionPtr() = temp_pos;Da kriegen wir aber einen Fehler:
error: non - lvalue in assignmentWir vermuten dass wir einen Zuweisungsoperator brauchen, aber wie machen wir den und für welches der beiden Objekte?
Da du die Variable, auf die der Zeiger verweist, ändern möchtest, mußt du diesen zuvor dereferenzieren:
*(get_monsterPtr (j)->get_positionPtr ()) = temp_pos;
-
Oh, die Klammern um das Ganze hatten wir vergessen. Danke!
-
Du könntest auch statt mit Pointern mit Referenzen arbeiten (int& monster::get_position();), dann würde dein ursprünglicher Code wieder richtig funktionieren - oder du bietest parallel zur get- eine set-Methode an:
class monster { public: int get_position() { return pos; } void set_position(int p) { pos=p; } private: int pos; };