2017-10-31 4 views
1

Ich versuche, über einen Vektor von Objekten zu iterieren und eine einfache Update-Funktion durchzuführen, die das Objekt jedes Mal um 1 Pixel nach rechts bewegt. Wenn ich den Code ausführe, wird der x-Wert jedoch nur einmal geändert.Iterieren über einen Vektor von Objekten

In source.cpp:

for (int i = 0; i < Screen::SCREEN_WIDTH * Screen::SCREEN_HEIGHT; i++) { 
    people.push_back(Person()); 
} 

for (int i = 0; i < 1; i++) { 
    people[i].isAlive = true; 
} 

while(true) { 

for (Person p : people) { 
     if (p.isAlive == true) { 
      p.Update(p); 
      cout << p.x << endl; 
      screen.setPixel(p.x, p.y, 255, 0, 0); 
     } 
     else { 
      screen.setPixel(p.x, p.y, 0, 0, 0); 
     } 
    } 
} 

In person.cpp

void Person::Update(Person &person) { 
     person.x += 1; 

}

Wie Sie sehen können, ich eine Person aus dem Array auswählen und sie am Leben sein und deshalb gezeichnet werden. Sie werden für jeden Frame gezeichnet, aber nicht aktualisiert. Kann mir jemand dabei helfen?

Antwort

3

for (Person p : people) erstellt eine Kopie jedes Element des Vektors zu sein, und dann modifizieren Sie die Kopie, die in den Vektor keine Auswirkung auf das ursprüngliche Objekt hat. Was Sie wollen, wäre for (Person& p : people).

Übrigens: Sie sollten die Verwendung von endl vermeiden, es sei denn, Sie müssen die Ausgabe sofort ausspülen. Stattdessen sollten Sie in den meisten Fällen nur '\n' ausgeben.

+0

Vielen Dank für die Hilfe. Wie Sie wahrscheinlich wissen, dass ich in C++ noch ziemlich neu bin, habe ich mich bei diesem Problem länger am Kopf kratzt, als ich zugeben würde. Aus Neugier, ist dies der effizienteste Weg, um über den Vektor zu iterieren. Es wird wahrscheinlich mehr als 100k + Person-Objekte enthalten, also frage ich mich nur, ob mein Weg der beste Weg ist, es zu tun? –

+0

@JamesMclaughlin Wenn Sie über so viele Objekte schleifen, um das Objekt zu finden, das ineffizient ist, könnte es besser sein, wenn Sie eine Variable haben, die ihren Index hält. – Barmar

+0

Aber müsste ich nicht immer noch iterieren, um das gewünschte Objekt zu finden? –

1

In dieser Erklärung:

for (Person p : people) { 
    ... 
} 

Sie eine Kopie in p-Objekt zu machen, es zu ändern, und am Ende, es

Um Ihre Änderungen zu bewahren zu zerstören, nicht:

for (Person &p : people) { 
    ... 
} 
1

Wenn Sie die Person innerhalb der Schleife ändern möchten, müssen Sie eine Referenz verwenden - sonst werden Sie mit einer Kopie arbeiten werden, was auch immer in der vector, whi ch wird dann verworfen.

for (Person p : people) { 

benötigt

for (Person& p : people) { 
Verwandte Themen