2016-05-04 8 views
-1

Das Problem ist, dass ich hier nicht die erwartete Ausgabe erhalten. Ich habe eine Klasse für Node, die den Vektor der Zeiger namens Neigbours hat. Ich möchte das Objekt in den Vektor einfügen.Vektoren von Zeigern Hinzufügen und Zugreifen

Node current = Node(1, 1, street , 2, 2); 
Node neighbour = Node(2, 2); 
neighbour.instreets.push_back(Street(1, 1, street, 2, 2)); 
nodes.push_back(neighbour); 

current.neighours.push_back(&nodes.at(0)); 
nodes.push_back(current); 

dann möchte ich darauf zugreifen, um auszudrucken.

cout << nodes[1].x << " " << nodes[1].y << endl; 
cout << "- " << nodes[0].outstreets[0].name << endl; 
cout << "ends " << nodes[1].neighours.at(0)->x << " " << nodes[1].neighours[0]->y << endl; 

Aber ich bekomme stattdessen einige Zufallszahlen für die Nachbarkoordinaten. Gehe ich falsch auf sie zu?

erwartete Ausgang ist

1 1 
- street 
ends 2 2 

EDIT: Knoten ist ein Vektor von Node-Objekten.

Antwort

1

Nachdem Sie ein Element zum Vektor nodes hinzugefügt haben, kann der Speicher neu zugewiesen werden. Dies bedeutet, dass seine Elemente an einen anderen Ort im Speicher verschoben werden, und Zeiger auf sie werden ungültig gemacht.

Insbesondere die Adresse, die Sie mit &nodes.at(0) genommen haben, ist nicht mehr gültig, nachdem die Ausführung nodes.push_back(current);

Es gibt mehrere Möglichkeiten, es zu beheben, aber die einfachste ist nodes ein deque statt vector zu machen. Deque reserviert den Speicher nicht neu, daher funktioniert der Code einwandfrei.

+0

Also ich nicht den Nachbarn den Vektor richtig hinzufügen? –

+1

Das Problem ist, dass Sie einen Zeiger auf den Speicher nehmen, der dem Vektor 'nodes' gehört. Siehe bearbeitete Antwort, um es zu beheben. – rburny

+0

Vielen Dank. Das funktioniert viel besser. –