2016-09-14 34 views
0

我有這樣的預定義的功能時謂詞錯誤。的remove_if:使一個函數返回布爾

void attack(std::vector<GameObject*> objects, unsigned damage) { 


    for (GameObject* object : objects) { 
     object->takeDamage(damage); 
     auto isDead = object->isDead(); 
     objects.erase(std::remove_if(objects.begin(),objects.end(),isDead), objects.end()); 
    } 
} 

這是我isDead功能

bool isDead() const { 
    if (destructed) { 
      std::cout << "memory error" << std::endl; 
     } 

    return life <= 0; 
} 

這是我不斷收到錯誤。已經嘗試了很多東西,但根本無法弄清楚這一點。任何幫助感謝!

錯誤:表達式不能用作函數 {return bool(_M_pred(* __ it)); }

+0

請編輯您的問題包含類似一般的功能[MCVE] – Slava

+0

您不能使用方法,你需要使用'的std :: bind' – Slava

+0

哪條線是發生在該錯誤? – Barmar

回答

5
  1. isDead是函數中的一個變量。您不能將其用作remove_if的參數。

  2. 您也不能使用常規成員函數作爲參數std::remove_if。改用lambda函數。

  3. 當您使用範圍for循環遍歷它時,不要從容器中擦除對象。

  4. 將參數更改爲attack作爲參考。否則,您將從副本中刪除對象,而不是原始容器。

這裏是attack的更新版本:

void attack(std::vector<GameObject*>& objects, unsigned damage) 
{ 
    for (GameObject* object : objects) 
    { 
     object->takeDamage(damage); 
    } 

    objects.erase(std::remove_if(objects.begin(),objects.end(), [](GameObject* object){return object->isDead();}), objects.end()); 
} 
+1

你忘了施加傷害! – Borgleader

+0

@Borgleader,注意到我發佈代碼後。 –

+4

還有一個問題,從副本中刪除對象 – Slava

0

isDead()是你的一個類的成員函數,這就是爲什麼它不工作:您沒有提供this指針(對象它將被調用。哦,remove_if的謂詞必須只有一個類型爲objects::value_type的參數。

而是執行此操作:

objects.erase(std::remove_if(objects.begin(),objects.end(),[](GameObject* object){return object->isDead()), objects.end()); 
+0

此外,由於目前來寫這個循環是O(N^2),因爲如果是在循環中刪除(這應該是在年底) – Borgleader

+0

@Borgleader:更糟糕的是,它會導致段錯誤。起初我沒有注意到。 –

+0

謝謝!是的,我無法弄清楚創建謂詞函數的方式。對C++來說非常新穎。 – Sam