[英]C++ call to deleted constructor. Understanding pointers vectors and for loops
我在理解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'
}
您發布的代碼有很多錯誤。 我將從頂部開始:
std::vector<Sprite> sprites;
這是在聲明類型對象的向量,而不是指針。
這是有問題的,因為此行:
Sprite::create("brick.png");
返回指向 Sprite
對象的指針 ,但是您正在執行此操作以將其添加到列表中:
sprites.push_back(*sprite);
sprite
前面的*
表示這是所謂的指針類型取消引用。 本質上,這將創建一個已經存在的sprite
的副本(使用副本構造函數)(使用Sprite
的副本構造函數)。
在此處刪除對象的原因:
Sprite sprite = sprites[i];
這是因為您要在sprite[i]
中創建該sprite的本地副本,然后在每次循環迭代后立即將其刪除(因為它不在范圍內)。
解決此問題的最佳方法是將子畫面矢量的定義更改為:
std::vector<Sprite*> sprites;
並且只處理指針。
然后,您可以更改此行:
sprites.push_back(*sprite);
至:
sprites.push_back(sprite);
這行:
Sprite sprite = sprites[i];
至:
Sprite* sprite = sprites[i];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.