我正在努力学习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'
}
答案 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];