私のゲームのメインループは次のようになります。
std::vector<std::unique_ptr<State>> states;
for(size_t i = 0; i < states.size(); i++)
{
states[i]->Update();
states[i]->Draw();
}
しかし、彼らはこれの欠陥です。反復中にベクトルを変更(状態を削除)することはできません。現在の状態を削除すると、反復がオンになり、updateを呼び出して描画する状態がないため、明らかに壊れます。states
そのため、ベクトルに追加する必要のある状態のベクトルを作成し、ベクトルに削除する必要のある状態のベクトルを作成することをお勧めしstates
ます。次に、ループが終了した後、states
ベクトルを変更すると、反復の途中で問題が発生することはありません。
std::vector<std::unique_ptr<State>> states;
std::vector<std::unique_ptr<State>> statesToBeAdded;
std::vector<std::unique_ptr<State>> statesToBeRemoved;
for(size_t i = 0; i < states.size(); i++)
{
states[i]->Update();
states[i]->Draw();
}
for(size_t i = 0; i < statesToBeAdded.size(); i++)
{
states.push_back(std::move(statesToBeAdded[i]));
}
statesToBeAdded.clear();
for(size_t i = 0; i < statesToBeRemoved.size(); i++)
{
states.erase(std::remove(states.begin(), states.end(), statesToBeRemoved[i]), states.end());
}
statesToBeRemoved.clear(); //error is thrown here
ベクトルから状態を削除することはできませんが、行states
にエラーがスローされます。これは、行を呼び出すと、ベクトルから要素が削除され、その要素がベクトルを指しているため、ベクトル内の同じ要素が無効になるstatesToBeRemoved.clear()
ためだと思います。存在しなくなったオブジェクト。states.erase(...)
states
statesToBeRemoved
ポインタが指しているものを破壊せずにstd::unique_ptrを削除することはできないので、states
ベクトル内の要素を無効にせずにベクトルから要素を削除する方法はないと思いますstatesToBeRemoved
。では、この問題をどのように解決するのでしょうか。
ありがとう。