C++ - 通过智能指针派生类
问题描述:
我有一个类Character
,它从基类CollidableObject
继承。您可能已经猜到,CollidableObject
具有检测其他CollidableObject
之间的冲突的方法,例如CircleCollidableObject
和SquareCollidableObject
。C++ - 通过智能指针派生类
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());
...
}
}
我会尝试。接下来我不知道,所以非常感谢。 – 2014-12-19 03:47:43
'bool CollidableObject :: collidesWith(const CollidableObject&)'是我的选择签名。 – 5gon12eder 2014-12-19 04:05:33
将智能指针更改为raw使得继承的方法和成员由于某种原因不可用。任何想法? – 2014-12-19 04:59:37