C++ 调用已删除的构造函数。理解指针向量和 for 循环

C++ call to deleted constructor. Understanding pointers vectors and for loops

我在理解 C++ 方面遇到了一些困难。我正在使用 cocos2dx 并尝试制作一个用于 breakout 游戏的精灵(砖块)矢量。我可以将一堆精灵添加到向量中(至少我认为我正在将它们加载到向量中),但是当我尝试遍历向量并读取它们时,我收到错误:"Call to deleted constructor of 'cocos2d::Sprite'"。我以为我理解指针,但任何人都可以向我解释我做错了什么以及这段代码是怎么回事吗?

std::vector<Sprite> sprites;
brick = Sprite::create("brick.png");
for ( int i = 0; i < 20; i++ ){
    Sprite *sprite = Sprite::create("brick.png");
    sprites.push_back(*sprite);
    this->addChild(sprite);
}
for (int i = 0; i < sprites.size(); i++){
    Sprite sprite = sprites[i]; //Call to deleted constructor of 'cocos2d::Sprite'
}

问题

您发布的代码有很多问题。我将从顶部开始:

std::vector<Sprite> sprites;

这是在声明 objects 类型的向量,而不是指针。

这是有问题的,因为这一行:

Sprite::create("brick.png");

Returns 指向 Sprite 对象的 指针 ,但您这样做是为了将其添加到列表中:

sprites.push_back(*sprite);

sprite 前面的 * 表示这就是所谓的指针类型的取消引用。这实质上创建了一个已经存在的 sprite 的副本(使用复制构造函数)(使用 Sprite 的复制构造函数。

此处删除对象的原因:

Sprite sprite = sprites[i];

是因为您正在 sprite[i] 中创建精灵的本地副本,然后在每次循环迭代后立即将其删除(因为它超出了范围)。

解决方案

解决此问题的最佳方法是将精灵向量的定义更改为:

std::vector<Sprite*> sprites;

并且只处理指针。

然后您可以更改此行:

sprites.push_back(*sprite);

至:

sprites.push_back(sprite);

还有这一行:

Sprite sprite = sprites[i];

至:

Sprite* sprite = sprites[i];