2014-12-19 138 views
0

我有一個類Character,它從基類CollidableObject繼承。您可能已經猜到,CollidableObject具有檢測其他CollidableObject之間的衝突的方法,例如CircleCollidableObjectSquareCollidableObjectC++ - 通過智能指針派生類

bool CollidableObject::collidesWith(std::shared_ptr<CollidableObject> &pCollidable) 
{ 
    ... 
} 

我用它來運行其他檢查,並最終處理碰撞。基本上我希望能夠遍歷我遊戲中的角色,傳遞兩個Character(即再次從CollidableObject繼承),並檢測到任何衝突。

void CharacterManager::collisions() 
{ 
    for(std::vector<std::shared_ptr<Character>>::iterator i = mCharacters_.begin(); i != mCharacters_.end(); i++) { 
     for(std::vector<std::shared_ptr<Character>>::iterator j = mCharacters_.begin(); j != mCharacters_.end(); j++) { 
      if(i == j) continue; 
      (*i)->collidesWith(*j); 
    ... 
} 

我寧願不使mCharacters_載體導入的CollidableObjects載體,如果我沒有到。但我不確定這是否唯一的方法。

回答

3

你可以重寫接口嗎?沒有什麼錯與有:

bool CollidableObject::collidesWith(const CollidableObject* pCollidable) 

想必collidesWith是不會把你傳遞指針的所有權,所以傳遞一個原始指針的罰款。

也就是說,shared_ptr<CollidableObject>實際上可以從shared_ptr<Character>構造。所以如果你想採取shared_ptr,你必須通過const引用而不是引用。那就是:從this reference

bool CollidableObject::collidesWith(std::shared_ptr<CollidableObject> p) 

見構造#9:

bool CollidableObject::collidesWith(const std::shared_ptr<CollidableObject>& p) 

或只是價值。

如果您使用std::shared_ptr,您至少應該在循環中使用auto以減少冗長度。而j迴路可以啓動一個過去i,以避免重複檢查每對:

for (auto i = mCharacters_.begin(); i != mCharacters_.end(); ++i) { 
    for (auto j = std::next(i); j != mCharacters_.end(); ++j) { 
     (*i)->collidesWith(j->get()); 
     ... 
    } 
} 
+0

我會嘗試。接下來我不知道,所以非常感謝。 – 2014-12-19 03:47:43

+0

'bool CollidableObject :: collidesWith(const CollidableObject&)'是我的選擇簽名。 – 5gon12eder 2014-12-19 04:05:33

+0

將智能指針更改爲raw使得繼承的方法和成員由於某種原因不可用。任何想法? – 2014-12-19 04:59:37