这是我的通用 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
内的状态 vector 到一个新的 vector 中,然后对 states
进行我想要的任何更改 vector ,这样在循环期间不会进行任何更改。
这就是我的想法:
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
在文件 xmemory0
。 “State”是我的抽象基类,其他状态继承自。我不明白为什么会收到此错误,因为我没有实例化该抽象类,而是实例化从它继承的类。 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());
}
最佳答案
也许传输您想要删除的元素会很简单:
std::vector<unique_ptr<state>> states;
while ( /* stuff */)
{
std::vector<unique_ptr<state>> temp;
for (std::size_t i = 0; i != states.size(); ++i)
{
if ( /* move? */)
{
temp.push_back(std::move(states[i]));
}
}
for (std::size_t i = 0; i != temp.size(); ++i)
{
// process temp[i]
}
}
删除的元素将是每个循环体末尾的 states
vector 中的空指针,因此您可能希望修剪这些元素:
states.erase(std::remove(states.begin(), states.end(), nullptr), states.end());
(目前还没有任何 std::copy_if
和 std::move_if
算法,但是一旦将它们添加到标准库中,此代码会变得短很多。)
关于c++ - 实例化继承类时出现无法实例化抽象类的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14431015/