在两个派生类之间执行专用代码

Executing specialized code between two derived classes

本文关键字:之间 执行 专用 代码 派生 两个      更新时间:2023-10-16

在游戏的任意物理引擎中,存在一个"Shape"超类及其派生的子类,如"AABB"或"Triangle"。每对之间的碰撞检测方法是独一无二的,例如AABB-Sphere测试与Triangle-AABB测试明显不同。如果我有两个这样的形状集合,并且我希望检查它们之间的一些冲突:

// somewhere in the program
Shape* shape_a;
Shape* shape_b;
....
if (shape_a->intersects(shape_b)) {
// do something
}

如何执行特定的碰撞检查(例如AABB-ABBB或AABB-Sphere(?例如,如果shape_a指向派生的三角形对象,并且shape_b执行派生的 AABB 对象,则相交函数如何正确比较三角形和 AABB 对象?我当前的实现如下,但它不会在创建包含循环时编译(可能是由于糟糕的 OOP 实践(。

形状.h

#include "AABB.h"
#include "triangle.h"
class Shape {
public:
virtual bool intersects(Shape* shape) = 0;
virtual bool intersects(AABB aabb) = 0;
virtual bool intersects(Triangle tri) = 0;
}

AABB.h

#include "shape.h"
class AABB : public Shape {
// overriden functions
bool intersects(Shape* shape);
bool intersects(AABB aabb); // aabb-aabb
bool intersects(Triangle tri); // aabb-tri
}

三角形.h

#include "shape.h"
class Triangle : public Shape {
// overriden functions
bool intersects(Shape* shape);
bool intersects(AABB aabb); // tri-aabb
bool intersects(Triangle tri); // tri-tri
}

相交(形状* 形状(函数的实现如下所示:

// in AABB.cpp
bool intersects(Shape* shape) {
return shape.intersects(*this); // where *this is an AABB object
}

当然,我想避免代码重复:tri-aabb 测试与 aabb-tri 测试相同。也许我正在编写的代码存在根本缺陷,并且是糟糕的 OOP 实践。无论如何,我将不胜感激对此问题的任何帮助!

为了避免include循环,你可以在shape.h中前向声明AABBTriangle类:

class AABB;
class Triangle;

为了避免基于参数顺序重复代码,您可以为每个重载对创建一个单独的函数,其中包含规范顺序,并使用成员函数中的不同顺序调用它:

bool intersects( AABB *, Triangle * );
AABB::intersects( Triangle *t ) { return intersects( this, t ); }
Triangle::intersects( AABB *b ) { return intersects( b, this ); }
相关文章: