我有一个继承自基类 CollidableObject
的类 Character
。您可能已经猜到了,CollidableObject
具有检测其他 CollidableObject
之间的碰撞的方法,例如 CircleCollidableObject
和 SquareCollidableObject
。
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/