这是我的通用 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
在 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
}
}
状态管理器.cpp
void StateManager::RemoveState(std::unique_ptr<State> state)
{
states.erase(std::remove(states.begin(), states.end(), state), states.end());
}