C ++ - 传递智能指针派生类

时间:2014-12-19 03:41:06

标签: c++ polymorphism smart-pointers

我有一个继承自基类Character的类CollidableObject。正如您可能已经猜到的那样,CollidableObject可以检测其他CollidableObject之间的冲突,例如CircleCollidableObjectSquareCollidableObject

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的向量。但我不确定这是否是唯一的方法。

1 个答案:

答案 0 :(得分:3)

你可以改写界面吗?拥有:

并没有错
bool CollidableObject::collidesWith(const CollidableObject* pCollidable)

据推测,collidesWith不会获取您传入的指针的所有权,因此传入原始指针就可以了。

尽管如此,shared_ptr<CollidableObject>实际上可以从shared_ptr<Character>构建。因此,如果您想要shared_ptr,则必须通过 const 引用而不是引用来获取它。那就是:

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

或仅按值:

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

参见this reference的构造函数#9。

如果你正在使用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());
        ...
    }
}