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

Cha*_*rts 1 c++ vector cocos2d-x

我在理解C ++方面有些挣扎。我正在使用cocos2dx并尝试制作一个用于突破游戏的精灵(砖)矢量。我能够在向量中添加一堆精灵(至少我想将它们加载到向量中),但是当我尝试遍历向量并读取它们时,我得到了一个错误:“调用已删除的' 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'
}
Run Code Online (Sandbox Code Playgroud)

Col*_*ett 5

问题

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

std::vector<Sprite> sprites;
Run Code Online (Sandbox Code Playgroud)

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

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

Sprite::create("brick.png");
Run Code Online (Sandbox Code Playgroud)

返回一个指针的Sprite对象,但你这样做是为了将其添加到列表:

sprites.push_back(*sprite);
Run Code Online (Sandbox Code Playgroud)

的*最前面sprite意味着这就是所谓的指针类型的取消引用。这实质上创建已经现存的副本(使用拷贝构造函数)sprite(使用Sprite的拷贝构造函数。

在此处删除对象的原因:

Sprite sprite = sprites[i];
Run Code Online (Sandbox Code Playgroud)

这是因为您要在中创建子画面的本地副本sprite[i],然后在每次循环迭代后立即将其删除(因为它不在范围内)。

解

解决此问题的最佳方法是将子画面矢量的定义更改为:

std::vector<Sprite*> sprites;
Run Code Online (Sandbox Code Playgroud)

并且只处理指针。

然后,您可以更改此行:

sprites.push_back(*sprite);
Run Code Online (Sandbox Code Playgroud)

至:

sprites.push_back(sprite);
Run Code Online (Sandbox Code Playgroud)

这行:

Sprite sprite = sprites[i];
Run Code Online (Sandbox Code Playgroud)

至:

Sprite* sprite = sprites[i];
Run Code Online (Sandbox Code Playgroud)