簡體   English   中英

對已刪除的構造函數的C ++調用。 了解指針向量和for循環

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM