2013-07-15 45 views
1

我想創建一個垂直滾動的射手,當你按空間時會創建一個子彈,然後當子彈熄滅時子彈就會被銷燬。我跟蹤過矢量delcared爲vector<BULLET> bullets;子彈的。當我試圖摧毀在屏幕外的任何子彈,我得到一噸的錯誤,如: c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\include\c++\bits\stl_algobase.h|384| required from '_OI std::__copy_move_a(_II, _II, _OI) [with bool _IsMove = true; _II = BULLET*; _OI = BULLET*]'|vector ::擦除導致奇怪的行爲

我的代碼看起來像這樣:

for(auto it = bullets.begin(); it != bullets.end();){ 
    if(it->is_dead()){ 
     it = bullets.erase(it); 
    }else{ 
     it++; 
    } 
} 

這是令人沮喪的我的是,我有類似的循環,它會刪除需要保存的指針與載體將被刪除任何遊戲對象:

for(auto it = activeInstances.begin(); 
it != activeInstances.end();){ 
    if((*it)->is_dead()){ 
     it = activeInstances.erase(it); 
    }else{ 
     it++; 
    } 
} 

這個工作得很好。

編輯:我不知道這是否有差別或沒有,但只是參考我補充說,在增加子彈的矢量相同的功能後出現部分:

if(key[SPACE] && reload == 0){ 
    reload = reloadTime; 
    BULLET newBullet; 
    newBullet.init(x, y); 
    bullets.push_back(newBullet); 
} 
+0

BULLET有一個移動構造函數嗎? – doctorlove

+0

如果((*)) - > is_dead()){...你可能需要在if() - > is_dead()){ * it – Igor

+1

'it->'可以訪問迭代器的對象,但是如果向量中的對象本身是點類型的,則必須通過'(* it) - >'去實現兩次:迭代器和迭代器持有的任何類型。 BULLET是指針類型嗎? – Pixelchemist

回答

1

代碼fragements不同:

if(it->is_dead()){ 

if((*it)->is_dead()){ 
+0

所以做這些片段正在使用的向量。這本身不是問題。 – jrok

+1

你是對的,'BULLET'的定義是至關重要的,但代碼差異暗示可能的錯誤原因。 – collapsar

+0

如果你能詳細說明最後一條語句collapsar,我會非常感激。一個是引用一個對象矢量,另一個引用一個指向對象的指針向量,這樣代碼中唯一的區別不應該導致任何問題,對吧? –

1

我會建議使用擦除remove慣用法std::vector 刪除的項目(可以考慮this StackOverflow Q&A進行了詳細的討論,也適用於其他容器):

// Erase elements matching "erasing_condition" from vector "v" 
v.erase(std::remove_if(v.begin(), v.end(), erasing_condition), v.end()); 

你的具體情況,你可能要使用像這樣的代碼:

// 
// Erase elements matching "BULLET.is_dead()" from vector "bullets". 
// ("bullets" is a "vector<BULLET>") 
// 
bullets.erase 
(  
    std::remove_if 
    ( 
     bullets.begin(), 
     bullets.end(), 

     // Erasing condition 
     [](const BULLET& bullet) 
     { 
      return bullet.is_dead(); 
     } 
    ), 
    bullets.end() 
); 

BTW:作爲風格指南,對於C++類名,我更喜歡Bullet而不是BULLETALL_UPPERCASE_STYLE通常保留給C++中的預處理器宏...)。

+0

我非常欣賞風格指南,我同意這會更好。我也嘗試了你的建議,但仍然出現錯誤。第一個是新的,並且是: ** stl_algo.h 1158 **'錯誤:'__result .__中的'operator ='不匹配___ gnu_cxx :: __ normal_iterator <_Iterator,_Container> :: operator * >()= std :: move ((*&__first .__ gnu_cxx :: __ normal_iterator <_Iterator,_Container> :: operator * >()))' candidate is:子彈和子彈::運算符=(子彈&)' 後,我得到了同樣的錯誤,如OP標記在bullets.erase的最後一行 –

0

問題,正如有人在評論中提到的那樣,是我在BULLET類中沒有使用移動構造函數(我是一個完全noob,甚至不知道它是什麼,直到它被提及)。我非常感謝大家的幫助,但我真的學到了很多東西!