虚拟方法和参数查找
Virtual methods and parameters lookup
我有以下类:
Collider (abstract based class)
BoxCollider
MeshCollider
SphereCollider
最后3个从对撞机上继承。
用例是,每个对撞机都应该检查它是否与其他任何围墙碰撞。
我想电话应该在对撞机课上,看起来像:
void Collider::checkCollisionsWithOtherColliders()
{
for(std::vector<Collider*>::iterator it ....)
{
if(this->isCollidingWith(*it){...}
}
}
现在出现的问题我应该如何定义iscolliding
我想我需要为每对山脉定义它,这意味着每种撞机类型都应为每种类型的对撞机作为参数,例如在spherecollider中:
class SphereCollider : public Collider
{
bool isCollidingWith(SphereCollider* c){..}
bool isCollidingWith(BoxCollider* c){..}
bool isCollidingWith(MeshCollider* c){..}
};
要确保通过对撞机基类访问此类方法,我需要定义
class Collider
{
virtual bool isCollidingWith(SphereCollider* c){..}
virtual bool isCollidingWith(BoxCollider* c){..}
.. and so on
};
另外,由于呼叫this->isCollidingWith(*it)
仅采用一个指针,而不是派对类,因此我希望在运行时自动采用这些虚拟方法的适当方法。但是,似乎并非如此:由于参数只是对撞机,因此它寻找一种使用Collider*参数的方法。
我唯一能想到的解决方案是在对撞机中定义:
bool isCollidingWith(Collider* collider)
{
if (0 != dynamic_cast<SphereCollider*>(collider))
return isCollidingWith(dynamic_cast<SphereCollider*>(collider));
else if (0 != dynamic_cast<BoxCollider*>(collider))
return isCollidingWith(dynamic_cast<BoxCollider*>(collider));
else if ...
}
不是真正优雅的。还有其他(适当的)处理此类情况的方法吗?谢谢!
这是 double Dispatch 的情况。在这里不会详细介绍它,因为它是一个已经广泛使用的成语,即使Wikipedia页面已过时,该术语的简单Google搜索也将产生不错的结果。
,因为您正在从撞机子里继承boxcollider,网格集团和sphecollider,所以您无需创建3种不同的方法来接受每个类的参数。这就是为什么OOP很棒。
您可以使用以下方式:
class Collider
{
virtual bool isCollidingWith(Collider* c){..}
};
class SphereCollider : public Collider
{
bool isCollidingWith(Collider* c){..}
};
class BoxCollider : public Collider
{
bool isCollidingWith(Collider* c){..}
};
class MeshCollider : public Collider
{
bool isCollidingWith(Collider* c){..}
};
由于通过多态性而在运行时进行iScolliding与虚拟时间是虚拟的,因此将基于调用它的对象调用正确的方法(前提继承的类也将变得抽象)。
示例:
Collider *c1 = new SphereCollider;
Collider *c2 = new BoxCollider;
Collider *c3 = new MeshCollider;
// To check if Sphere is colliding with anything
// This will go to the implementation in SphereCollider
c1->isCollidingWith(c2);
c1->isCollidingWith(c3);
// To check if Box is colliding with anything
// This will go to the implementation in BoxCollider
c2->isCollidingWith(c1);
c2->isCollidingWith(c3);
// To check if Mesh is colliding with anything
// This will go to the implementation in MeshCollider
c3->isCollidingWith(c1);
c3->isCollidingWith(c2);
希望这会有所帮助。
相关文章:
- 参数相关查找和流运算符重载
- 编译器在C++中调用另一个函数时,在参数中查找已删除的构造函数
- 当数组在C++中用作参数时,查找数组的元素数
- C++ 普通查找与参数相关查找
- 运算符<<依赖于参数的查找不在全局命名空间中查找
- 查找可变参数列表的字符串格式指定符
- 在参数相关查找之前进行模板替换的任何方法(或解决方法?
- 如何查找/删除具有特定参数的结构向量的元素
- C 中的参数查找
- 支持与参数有关的查找的编译器
- 为什么在其他函数中声明的函数不参与参数相关查找?
- 使用查找表选择具有运行时索引的可变参数类型
- 为什么在这种情况下不考虑依赖于参数的查找?
- 数组作为函数参数查找数组长度时出错
- 仅通过参数查找重载地址
- 重载函数查找轮廓的实例与参数列表不匹配
- 我如何避免使用依赖于参数的查找明确专门化模板化功能
- 查找参数包的唯一值的数目
- 查找参数时出错
- 用于查找参数是否为类的不同模板语法