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

C++ 在两个派生类之间执行专用代码,c++,oop,C++,Oop,在游戏的任意物理引擎中,存在一个“形状”超类及其派生的子类,如“AABB”或“三角形”。每对之间的碰撞检测方法是唯一的,例如AABB球体测试将明显不同于三角形AABB测试。如果我有两个形状集合,并且我希望检查它们之间的碰撞: // somewhere in the program Shape* shape_a; Shape* shape_b; .... if (shape_a->intersects(shape_b)) { // do something } 如何执行特定碰撞

在游戏的任意物理引擎中,存在一个“形状”超类及其派生的子类,如“AABB”或“三角形”。每对之间的碰撞检测方法是唯一的,例如AABB球体测试将明显不同于三角形AABB测试。如果我有两个形状集合,并且我希望检查它们之间的碰撞:

// somewhere in the program
Shape* shape_a;
Shape* shape_b;

....

if (shape_a->intersects(shape_b)) {
    // do something
}
如何执行特定碰撞检查(例如AABB-ABBB或AABB球体)?例如,如果shape_a指向派生的三角形对象,shape_b对派生的AABB对象执行操作,则“相交”函数如何正确比较三角形和AABB对象?我当前的实现如下所示,但它不会在创建include循环时编译(可能是由于糟糕的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
}
三角形

#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
}
相交(Shape*Shape)函数的实现如下所示:

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

当然,我想避免代码重复:tri-aabb测试与aabb-tri测试相同。也许我写的代码根本上是有缺陷的,是糟糕的OOP实践。在任何情况下,我都将感谢您对这个问题的任何帮助

为了避免
include
循环,您可以在shape中向前声明
AABB
Triangle
类。h:

class AABB;
class Triangle;
为了避免基于参数顺序重复代码,您可以使用一个单独的函数,每个重载对具有规范顺序,并使用成员函数的不同顺序调用它:

bool intersects( AABB *, Triangle * );

AABB::intersects( Triangle *t ) { return intersects( this, t ); }
Triangle::intersects( AABB *b ) { return intersects( b, this ); }

你可以做布尔
相交(AABB*AABB)ie传入指针而不是整个类。现在您可以向前声明AABB,只需说
classaabb我的直觉反应是,形状的知识应该隐藏在形状中,这样就不会有形状特定方法的N^2/2爆炸。交集是游戏编程的一个基本单元,它会有一个模式,这一点我都不会感到惊讶。啊,事实上,它是@pm100Thank!这个解决方案似乎工作得很好,它避免了冲突检查的代码重复