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

时间:2016-03-05 00:13:08

标签: c++ vector cocos2d-x

我正在努力学习c ++。我正在使用cocos2dx并尝试制作一个用于breakout游戏的精灵(砖块)矢量。我能够在向量中添加一堆sprite(至少我认为我将它们加载到向量中),但是当我尝试迭代向量并读取它们时,我收到一个错误:" Call to deleted ' 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'
}

1 个答案:

答案 0 :(得分:4)

问题

您发布的代码存在许多问题。我将从顶部开始:

std::vector<Sprite> sprites;

这是声明一个对象类型的向量,而不是指针。

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

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

指针返回给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];