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)
您发布的代码有很多错误。我将从顶部开始:
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)
| 归档时间: |
|
| 查看次数: |
4011 次 |
| 最近记录: |