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];
我在理解 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];