在运行时写入向量时出现访问冲突

时间:2018-01-25 23:37:02

标签: c++ pointers vector

我是C ++的新手,刚开始使用指针等等。我正在用SFML做一个简单的游戏。我制作了一个矢量“drawList”来存储将在屏幕上呈现的游戏中的所有形状。如果我在主循环开始之前将形状添加到向量中它工作正常,但是当我在运行时添加对象时,我在以下代码上遇到访问冲突错误:

for (size_t i = 0; i < drawList.size(); i++){
        window.draw(*drawList[i]);
    }

我认为* drawlist [i]是一个无效的指针,但到目前为止尝试解决这个问题的尝试都没有成功。 drawList向量和向其添加对象的方法在标题中设置如下:

extern std::vector<const sf::Drawable*> drawList;

struct Globals {
    void AddDrawable(const sf::Drawable &drawable);
};

和相关的cpp中的这个一样:

std::vector<const sf::Drawable*> drawList;
void Globals::AddDrawable(const sf::Drawable & drawable){
    drawList.push_back(&drawable);
}

然后我尝试通过调用“AddDrawable”方法并将以下方法作为参数提供给新实例化的抛射物类的构造函数中的向量:

    sf::RectangleShape& GetShape() { return shape; };

我觉得事情的引用和指针确实存在明显的问题,但到目前为止我还没弄清楚。如果有人可以建议我解决这个问题的方法,那将会非常有用。提前谢谢!

编辑: 我将尝试给出一些有关Cris Luengo建议的更多背景信息,我有一个包含main while循环的main.cpp。在启动循环之前,我实例化PlayerProjectile类。在while循环中,我检查是否有任何更新并在forloop中绘制,如下所示:

int main() {
Projectile bullet = Projectile(WINDOW_WIDTH /2.f, WINDOW_HEIGHT /2.f, 0.05f, 0.05f);
Player player = Player(WINDOW_WIDTH / 2.f, WINDOW_HEIGHT / 1.2f);

while (true) {
    window.clear(Color::Black);
    if (Keyboard::isKeyPressed(Keyboard::Key::Escape)) break;

    for (size_t i = 0; i < updateList.size(); i++){
        updateList[i]();
        window.draw(*drawList.at(i));
    }
    window.display();

updateListdrawList都是从PlayerProjectile类的构造函数中填充的向量(对于播放器和抛射物构造器分别):

Projectile::Projectile(float mX, float mY, float velX, float velY){
    velocity = sf::Vector2f(velX, velY);
    GetShape().setPosition(mX, mY);
    //other shape stuff
    Globals globals;
    updateIndex = globals.AddToUpdateList([this]() {Update(); });
    globals.AddDrawable(GetShape());
}

如前所示,GetShape()方法设置在PlayerProjectile标题中,如下所示:

sf::RectangleShape& GetShape() { return shape; };

就目前而言,当我在while循环开始之前实例化要添加到drawList的对象时,此代码可以正常工作。如果我在运行时读取新数据,当它也被读取时,程序会在访问drawList时在forloop中抛出访问冲突错误。

在运行时向drawList添加内容时,我使用相同的代码。我只是在按下按钮时实例化一个新的Projectile。想法是实例化类的构造函数将所需数据添加到列表中(updateList工作正常) 提前谢谢

0 个答案:

没有答案