C++ - 通过智能指针派生类

问题描述:

我有一个类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载体,如果我没有到。但我不确定这是否唯一的方法。

你可以重写接口吗?没有什么错与有:

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