c++ - 实例化继承类时出现无法实例化抽象类的错误

标签 c++ game-loop

这是我的通用 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_ifstd::move_if 算法,但是一旦将它们添加到标准库中,此代码会变得短很多。)

关于c++ - 实例化继承类时出现无法实例化抽象类的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14431015/

相关文章:

c++ - C++中的IF嵌套

c++ - 从基本查看中隐藏字符串(例如记事本)

multithreading - 关于游戏循环、滴答和实时编程的一些问题

java - 键盘轮询系统

c++ - Gtkmm:如何暂停应用程序的执行并等待用户输入?

c++ - 打开文件时出现问题并且可能将文件输入/输出到字符串

c++ - 具有零参数和逗号的可变参数宏

javascript - JS : Collision Detection doesn't work when Ball is moving faster

python - 在幕后 PyGame 游戏可以运行,但图像不会移动

java - 限制 FPS OpenGL 有什么好处