gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 00:20:56 25 4
gpt4 key购买 nike

我有一个继承自基类 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com