C++ 错误C2280。正在尝试引用已删除的函数。试图从敌方数据结构中删除敌方和激光时出现此错误

C++ 错误C2280。正在尝试引用已删除的函数。试图从敌方数据结构中删除敌方和激光时出现此错误,c++,oop,C++,Oop,我在OOP中用C++/SDL构建我的第一个游戏,遇到了一个我在游戏的单一文件版本中没有遇到的问题 在检查碰撞时,如果检测到碰撞,我希望从我的数据结构中销毁玩家激光和敌舰,但我遇到了一个无法解决的错误 错误C2280。正在尝试引用已删除的函数 在不发布太多代码的情况下,为了让您更容易阅读,我已经包含了我认为必要的内容。 “CheckCollisions”是从包含敌人和激光的数据结构的函数调用的 多谢各位 game.cpp void Game::start(Display& display,

我在OOP中用C++/SDL构建我的第一个游戏,遇到了一个我在游戏的单一文件版本中没有遇到的问题

在检查碰撞时,如果检测到碰撞,我希望从我的数据结构中销毁玩家激光和敌舰,但我遇到了一个无法解决的错误

错误C2280。正在尝试引用已删除的函数

在不发布太多代码的情况下,为了让您更容易阅读,我已经包含了我认为必要的内容。 “CheckCollisions”是从包含敌人和激光的数据结构的函数调用的

多谢各位

game.cpp

void Game::start(Display& display, Media& media, Player& player)
{
    //Initialize SDL
    if (!display.init())
    {
        printf("Failed to initailize.", SDL_GetError());
    }
    else
    {
        //Load all media
        if (!media.load(display))
        {
            printf("Failed to load media", SDL_GetError());
        }
        else
    {
        SDL_Event e;

        std::vector<Enemy> enemies; //Holds all enemies
        std::vector<Laser> playerLasers; //Holds all of player lasers
        //std::vector<Laser> enemyLasers; //Holds all of the enemy lasers

        addEnemy(enemies); //Adds enemies to the game
        //Begin game loop
        while (!m_quit)
        {
            //Event management
            while (SDL_PollEvent(&e) != 0)
            {
                if(e.type == SDL_KEYDOWN)
                { 
                    player.movement(e);
                }
                if (e.type == SDL_MOUSEBUTTONDOWN)
                {
                    player.shoot(playerLasers);
                }
            }

            //Movement
            player.movementBounds();
            moveLasers(playerLasers);
            moveEnemies(enemies);

            //Collision detection
            checkCollisions(player, enemies, playerLasers);

            //Render
            display.render(media, player, enemies, playerLasers);


            //Simulate 60 fps - Read on tutorial, not entirely sure if this is ok. 
            SDL_Delay(16);
        }
    }
}
void游戏::开始(显示和显示、媒体和媒体、播放器和播放器)
{
//初始化SDL
如果(!display.init())
{
printf(“初始化失败。”,SDL_GetError());
}
其他的
{
//加载所有媒体
如果(!媒体加载(显示))
{
printf(“加载媒体失败”,SDL_GetError());
}
其他的
{
SDL_事件e;
std::vector敌人;//容纳所有敌人
std::vector playerLasers;//容纳所有播放器激光器
//矢量enemyLasers;//拥有所有敌人的激光
Addnemy(敌人);//在游戏中添加敌人
//开始游戏循环
而(!m_退出)
{
//事件管理
while(SDL_PollEvent(&e)!=0)
{
if(e.type==SDL_KEYDOWN)
{ 
运动员动作(e);
}
if(e.type==SDL_MOUSEBUTTONDOWN)
{
球员投篮(球员激光);
}
}
//运动
player.movementBounds();
移动激光器(playerLasers);
移动敌人(敌人);
//碰撞检测
对弈(玩家、敌人、玩家玩家);
//渲染
显示。渲染(媒体、玩家、敌人、玩家激光);
//模拟60 fps-阅读教程,不完全确定这是否正确。
SDL_延迟(16);
}
}
}
}

bool游戏::检查冲突(玩家和玩家,std::向量和敌人,std::向量和玩家激光器,int和enemyPos)
{
//检查玩家激光/敌人碰撞
对于(int playerLaser=0;playerLaser
敌人

#pragma once

#include <SDL.h>
#include "MoveDirection.h"

struct Enemy
{
    Enemy(SDL_Rect pos, int movementSpeed, MoveDirection dir)
    {
        m_pos = pos;
        m_movementSpeed = movementSpeed;
        m_dir = dir;
    }

    SDL_Rect m_pos; //Position of enemy
    int m_movementSpeed = 0; //Movement speed of enemy
    MoveDirection m_dir; //Movement direction of enemy
    const int MIN_X_POS = 0;
    const int MAX_X_POS = 750;
};
#pragma一次
#包括
#包括“MoveDirection.h”
结构敌人
{
敌方(垂直位置、内部移动速度、移动方向)
{
m_pos=pos;
m_movementSpeed=移动速度;
m_dir=dir;
}
SDL_Rect m_pos;//敌人的位置
int m_movementSpeed=0;//敌人的移动速度
移动方向m_dir;//敌人的移动方向
const int MIN_X_POS=0;
const int MAX_X_POS=750;
};
雷射

#pragma once
#include <SDL.h>
#include "MoveDirection.h"
struct Laser
{
    Laser(SDL_Rect pos, int movementSpeed, MoveDirection dir)
    {
        m_pos = pos;
        m_movementSpeed = movementSpeed;
        m_dir = dir;
    }

    SDL_Rect m_pos; //Position of enemy
    int m_movementSpeed = 0; //Movement speed of enemy
    MoveDirection m_dir; //Movement direction of enemy
};
#pragma一次
#包括
#包括“MoveDirection.h”
结构激光器
{
激光器(SDL_Rect pos,int movementSpeed,MoveDirection dir)
{
m_pos=pos;
m_movementSpeed=移动速度;
m_dir=dir;
}
SDL_Rect m_pos;//敌人的位置
int m_movementSpeed=0;//敌人的移动速度
移动方向m_dir;//敌人的移动方向
};

你用
开始你的循环(int敌人=0;敌人<敌人.size();敌人++)
但是在循环内部你调用
敌人.erase(敌人.begin()+敌人)这意味着循环索引现在无效。你开始时使用了一个大小为bize-friends.size()的向量,但是你通过在循环中调用erase来调整它的大小

你开始循环时使用了
for(int-friends=0;friends
但是在循环中你调用了
friends.erase(friends.begin()+friends)这意味着循环索引现在无效。您从一个大小为bize.size()的向量开始,但您通过在循环中调用erase来调整它的大小

敌方类有两个常量成员,因此编译器无法为此类生成赋值运算符,并将其定义为deleted(因此会发生“deleted function”错误)。

敌方类有两个常量成员,因此,编译器无法为此类生成赋值运算符,并将其定义为已删除(因此发生“已删除函数”错误)。

错误发生在哪里?您试图调用什么函数?为更清楚起见,请编辑。请提供源代码行和错误全文message@Ryan您刚刚添加了更多代码…敌方类有两个常量成员,因此无法为该类生成赋值运算符(因此发生“删除函数”错误)。错误发生在哪里?您试图调用什么函数?为更清楚起见,请编辑。请提供源代码行和错误全文message@Ryan您刚刚添加了更多代码…敌方类有两个常量成员,因此无法为该类生成赋值运算符(因此出现“已删除函数”错误)是的,看起来还是老伙计。我看不见。这是我在代码中看到的全部。祝你好运。是的,看起来还是老伙计。我看不见。这是我在代码中看到的全部。祝你好运
#pragma once
#include <SDL.h>
#include "MoveDirection.h"
struct Laser
{
    Laser(SDL_Rect pos, int movementSpeed, MoveDirection dir)
    {
        m_pos = pos;
        m_movementSpeed = movementSpeed;
        m_dir = dir;
    }

    SDL_Rect m_pos; //Position of enemy
    int m_movementSpeed = 0; //Movement speed of enemy
    MoveDirection m_dir; //Movement direction of enemy
};