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

标签 c++ polymorphism smart-pointers

我有一个继承自基类 CollidableObject 的类 Character。您可能已经猜到了,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_ vector 变成 CollidableObjects 的 vector 。但我不确定这是否是唯一的方法。

最佳答案

你能重写界面吗?有没有错:

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());
        ...
    }
}

关于C++ - 传递智能指针派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27559379/

相关文章:

c++ - 迭代 Boost 属性树中的项目

c++ - 模板推导,这符合吗?

c++ - Boost.Python 和 std::shared_ptr 的多态行为

java - JPA/Hibernate - 多态多对一关系设计

c++ - CComPtr 通过引用传递

c++ - 将 libusb 设备存储在易于访问的容器中,没有所有权

c++ - 不同IPC机制的使用

c++ - 重载方法未在强制转换运算符重载中调用

c++ - 为 union 交换非事件 std::unique_ptr 数据成员

c++ - 你如何实例化智能指针类成员?