c – 使用未知指针类型调用函数重载
发布时间:2020-12-16 07:08:45 所属栏目:百科 来源:网络整理
导读:所以,我有一个基类PhysicsObject,一个子类Colliding,以及两个从中派生出来的类,静态和牛顿. 检查碰撞时,我将所有碰撞写入std :: vector的std ::对碰撞*,碰撞* collisionVector. (碰撞检测是相当基本的,并不是问题的真正部分.) 现在,在检测到所有冲突之后,我
所以,我有一个基类PhysicsObject,一个子类Colliding,以及两个从中派生出来的类,静态和牛顿.
检查碰撞时,我将所有碰撞写入std :: vector<的std ::对<碰撞*,碰撞*> > collisionVector. (碰撞检测是相当基本的,并不是问题的真正部分.) 现在,在检测到所有冲突之后,我遍历collisionVector并调用静态碰撞方法,该方法具有以下四个重载: void collide(Newtonian* first,Newtonian* second); void collide(Newtonian* object,Static* obstacle); inline void collide(Static* obstacle,Newtonian* object){ collide(object,obstacle); } void collide(Static* first,Static* second); 问题是我必须每次检查我正在处理的对象类型,并且我可能会引入更多的Colliding子类. 如何以简单的方式决定调用哪个过载? 当前代码: 这就是我的代码目前的样子.不漂亮. for (pair<Collision*,Collision*> coll : collisionVector){ Colliding* first = get<0>(coll); Colliding* second = get<1>(coll); if (Newtonian* firstNewt = dynamic_cast<Newtonian*>(first)){ if (Newtonian* secNewt = dynamic_cast<Newtonian*>(second)){ collide(firstNewt,secNewt); } else if(Static* secStat = dynamic_cast<Static*>(second)){ collide(firstNewt,secStat); } } else if(Static* firstStat = dynamic_cast<Static*>(first)){ if (Newtonian* secNewt = dynamic_cast<Newtonian*>(second)){ collide(firstStat,secNewt); } else if(Static* secStat = dynamic_cast<Static*>(second)){ collide(firstStat,secStat); } } } 解决方法
我不知道是否有一个简单的C技巧可以帮助你(你需要的是两个对象的虚拟功能分辨率……).
如果你只需要处理2种具体类型(牛顿和静态),我会保留你已有的代码.如果你想支持更多类型,你需要使你的代码更通用,这样你就不会编写N ^ 2个案例. 我会实现某种碰撞处理注册,您可以在其中注册两个具体类型和处理它们的方法.但这并不容易. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |