尝试填充std :: vector时出错C2280(引用已删除的函数)

时间:2017-08-10 12:48:52

标签: c++ compiler-errors

我正在使用C ++编写一个简单的dungeon爬虫。为了管理敌人,我创建了一个Enemy::Enemy(const Enemy&)我的类“Enemy”,但当我尝试Enemy::Enemy(const Enemy&) = default新创建的实例时,Visual Studio抱怨我引用了已删除的函数push_back(enemy)。 到现在为止还挺好。经过一些激烈的谷歌搜索后,我发现Visual Studio显然会隐式覆盖生成的复制构造函数并删除它。在一个答案中,有人解释说我必须将拷贝构造函数设置为默认(push_back(std::move(enemy))),但这并没有解决问题。 另一种解决方案是使用移动构造函数不使用std::vector<Enemy> enemies; int reservedSpace = rndDeco(eng); //how many enemies will be spawned enemies.reserve(reservedSpace); for (int i = 0; i < reservedSpace; i++ ) { Enemy x(&monsters[rnd(eng)], sf::Vector2u(5, 4), 0.2f, 100.0f, 110, 10); enemies.push_back(std::move(x)); //pushing back an uninitialized enemy } 复制实例,而是使用class Enemy { public: Enemy(sf::Texture* texture, sf::Vector2u imageCount, float switchTime, float speed, int baseHealth, int baseStrength); Enemy(const Enemy&) = default; Enemy(Enemy&&) noexcept {} //deleting this and just pushing back results in a C2280 //however using it and std:: move to move the instance to the vector //results in an uninitialized instance Enemy(); ~Enemy(); ... (other functions which are not important) public: int direction; int counter; bool isVisible; bool dead = false; bool attacks = false; int timer = 0; int strength; private: RandomOperations rndOp; sf::RectangleShape body; Animation animation; unsigned int row; float speed; bool faceRight; int health; }; 移动它。这导致实例未正确初始化......

我现在完全不知道为什么会发生这种情况,如果有人能解释我为什么会出现这些错误以及如何解决这些错误,我会非常高兴。

main.cpp中:

.toItDifferently()

Enemy.h

one.delegate {
    fun One.doItDifferently(){
        println("Test B")
    }
    doItDifferently() // <- here
}

如果我错过了一些重要的代码,请告诉我,我会添加它。

我希望你能帮助我,对不起,如果这是一个愚蠢的问题,但我查看了与C2280有关的所有其他问题,但找不到对我有帮助的答案。

编辑:在tobi303

的帮助下解决了这个问题

0 个答案:

没有答案