2017-10-31 4 views
1

私は、オブジェクトのベクトルを繰り返し処理し、毎回オブジェクトを1ピクセル右に移動させる単純な更新機能を実行しようとしています。しかし、コードを実行すると、xの値は1回だけ変更されます。 source.cppでオブジェクトのベクトルを反復する

:person.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); 
     } 
    } 
} 

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

}

あなたが見ることができるように、私は配列から1人を選択して、生きているためにそれらを設定します、そのために描かれる。それらはフレームごとに描画されますが、更新されません。誰もがこれで私を助けることができますか?このステートメントで

答えて

3

for (Person p : people)すべきベクトルの各要素のコピーを作成し、その後、ベクター内の元のオブジェクトに影響を及ぼさないコピーを変更しています。あなたが望むのはfor (Person& p : people)です。

ちなみに、実際に出力をすぐにフラッシュする必要がない限り、endlは使用しないでください。代わりに、ほとんどの場合'\n'を出力するだけです。

+0

ありがとうございました。あなたはおそらく私がC++にはまったく新しいと言うことができるので、私はこの問題で私の頭を私が認めようと思っているよりも長い間掻いていました。好奇心のために、これをベクトル上で反復する最も効率的な方法ですか?それはおそらく100k以上のPersonオブジェクトを含んでいるので、私の方法がそれを行う最良の方法であるかどうか疑問に思っていますか? –

+0

@ JamesMclaughlin興味のあるものを見つけるために非常に多くのオブジェクトをループすることは効率が悪くなります。インデックスを保持している変数があった方が良いかもしれません。 – Barmar

+0

しかし、私が望んでいるオブジェクトを見つけるためにはまだ繰り返す必要はありませんか? –

1

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

あなたはそれを変え、p個のオブジェクトにコピーを作成し、そして、最後に、行う、変更内容を保存するためにそれを

を破壊:

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

ループ内でPersonを変更する場合は、参照を使用する必要があります。そうでなければ、vectorにあるもののコピーで作業しますchは破棄されます。

for (Person p : people) { 

ニーズ

for (Person& p : people) { 
関連する問題