在两个派生类之间执行专用代码
Executing specialized code between two derived classes
在游戏的任意物理引擎中,存在一个"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中前向声明AABB
和Triangle
类:
class AABB;
class Triangle;
为了避免基于参数顺序重复代码,您可以为每个重载对创建一个单独的函数,其中包含规范顺序,并使用成员函数中的不同顺序调用它:
bool intersects( AABB *, Triangle * );
AABB::intersects( Triangle *t ) { return intersects( this, t ); }
Triangle::intersects( AABB *b ) { return intersects( b, this ); }
相关文章:
- 如何在两个 boost::multi_arrays (C++) 之间执行数学运算?
- 共享库 (.so) 没有扩展名的 Linux 可执行文件之间的区别?
- OpenCV 函数 cv::remap() 的执行时间更长,当程序在两者之间进入睡眠状态时
- 为什么我的 cout 一次执行,尽管 cin 应该在两者之间读取?
- 如果我在下面的代码中使用 list 而不是 vector,为什么在我尝试在迭代器之间执行减法的行中编译失败?
- 在两个派生类之间执行专用代码
- 如何使用灵活的碰撞库在两个点云或点云与机器人末端执行器模型之间进行碰撞检测
- 从本地工作,但在执行之间的随机端口上没有收到任何内容
- 如何在C++17中强制执行模板和模板模板参数之间的约束
- C 编译器如何在延期和异步执行std :: async之间进行选择
- 为什么这两个实现多维数组之间会有如此巨大的执行时间差
- 两个代码段之间执行时间的奇怪差异
- 执行未在线程(c++11)之间切换
- 两个 C++ 可执行对象之间的实时数据通信,一个是 Windows 和另一个在虚拟机 Ubuntu 中
- 相同大小的2D和1D阵列之间的内存或执行问题
- 为什么语言的简单性和执行时间之间似乎存在紧张关系
- std::map in class:在执行速度和内存使用之间进行权衡
- 我可以在两个istream_iterators之间执行分配操作吗?
- 使用 lerp 在两个图像之间执行线性插值
- 如何在两个容器的元素之间执行成对二进制操作?