これは私の一般的な C++ ゲーム ループです。
std::vector<std::unique_ptr<State>> states;
while(window.isOpen())
{
//event checking and other stuff
for(size_t i = 0; i < states.size(); i++)
{
states[i]->Update();
//clear backbuffer
states[i]->Draw(window);
//draw backbuffer
}
}
問題は、リストから状態を削除するたびにstates
、プログラムがクラッシュすることです。状態が削除されると、オブジェクトが明らかに存在しなくなったため、オブジェクトを使用できなくなるためだと思います。
states
これを修正する最善の方法は、ベクター内の状態を新しいものにコピーし、ベクターに必要な変更を加えてstates
、ループ中に変更が行われないようにすることだと確信しています。
だからこれは私が思いついたものです:
std::vector<std::unique_ptr<State>> states;
std::vector<State> tempStates;
while(window.isOpen())
{
//event checking and other stuff
for(size_t i = 0; i < states.size(); i++)
{
tempStates.push_back(*states[i]);
}
for(size_t i = 0; i < tempStates.size(); i++)
{
tempStates[i].Update();
//clear backbuffer
tempStates[i].Draw(window);
//draw backbuffer
}
tempStates.clear();
}
error C2259: 'State' : cannot instantiate abstract class
しかし、アプリケーションをビルドすると、 in fileというエラーが表示されますxmemory0
。「状態」は、他の状態が継承する抽象基本クラスです。その抽象クラスをインスタンス化していないため、このエラーが発生する理由がわかりません。それを継承するクラスをインスタンス化しています。オブジェクトでstates
いっぱいではありませんそれから継承するオブジェクトでいっぱいです。ある意味でオブジェクトでいっぱいになると思いますが、インスタンス化していません。State
State
では、なぜこのエラーが発生するのですか?どうすれば解決できますか?
ありがとう。
編集
states
これは基本的に、上記の最初の方法を使用するときに内部の要素が削除される方法です。これは、から継承するクラス内にありState
ます。
void Update()
{
if(/*whatever*/)
{
StateManager::RemoveState(std::unique_ptr<State>(this));
//call stack comes back here but cant because this no longer exists
}
}
StateManager.cpp
void StateManager::RemoveState(std::unique_ptr<State> state)
{
states.erase(std::remove(states.begin(), states.end(), state), states.end());
}