加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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个案例.

我会实现某种碰撞处理注册,您可以在其中注册两个具体类型和处理它们的方法.但这并不容易.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读