在实例化继承类时无法实例化抽象类
Error Cannot Instantiate Abstract Class when Instantiating Inherited Class
这是我的通用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
在文件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
}
}
StateManager.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
向量中的空指针,因此您可能希望删除它们:
states.erase(std::remove(states.begin(), states.end(), nullptr), states.end());
(目前还没有任何std::copy_if
和std::move_if
算法,但是一旦它们被添加到标准库中,这段代码将变得短得多。)
相关文章:
- ATL::CComContainedObject<contained>: C2259 无法实例化抽象类
- 如何使用其中一个具体类实例化抽象类?
- 无法实例化抽象类错误
- 无法实例化抽象类,但类不是抽象/派生方法的参数
- 'AMA::我的产品':无法实例化抽象类
- 无法实例化抽象类
- 如何修复错误C2259:无法实例化抽象类
- C++,不能实例化抽象类
- 无法使用多重继承 c++ 实例化抽象类
- 无法实例化抽象类
- C++,无法实例化抽象类错误
- C2259:'ATL::CComObject<Base>':无法实例化抽象类
- 错误 C2259:'CDocument':无法实例化抽象类
- 帮助错误 C2259:无法实例化抽象类
- 无法实例化抽象类
- 错误 C2259"类":无法实例化抽象类
- 不能实例化抽象类的对象,但必须返回该类的对象
- 继承错误 - 无法实例化抽象类 无法访问在类中声明的受保护成员
- 无法使用 c++11 实例化抽象类
- 创建 CTI 适配器时无法实例化抽象类