我正在使用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
的帮助下解决了这个问题