对于 C 编程语言家族中的任何语言(C、C++、C# 等),我完全是菜鸟。
我试图了解有关物理引擎如何工作的基础知识,我发现了 Randy Gaul's tutorial on how to make a 2d physics engine从头开始。我从this repo下载了源代码我试图了解发生了什么。我是一个体面的(不是最好的)Java 程序员,所以我知道发生了什么,直到我进入这个部分。
结构/类中有一个名为 shape 的枚举:
struct Shape
{
enum Type
{
eCircle,
ePoly,
eCount
};
...
}
然后在 Collision.h
中:
typedef void (*CollisionCallback)( Manifold *m, Body *a, Body *b );
extern CollisionCallback Dispatch[Shape::eCount][Shape::eCount];
在 Collision.cpp
中:
CollisionCallback Dispatch[Shape::eCount][Shape::eCount] =
{
{
CircletoCircle, CircletoPolygon
},
{
PolygontoCircle, PolygontoPolygon
},
};
CircletoCircle、CircletoPolygon、PolyontoCircle、PolygontoPolygon 都是形式为 functionName( Manifold *m, Body *a, Body *b )
根据我的理解,我相信这个人声明了一个返回 void 的类型,称为 CollisionCallBack 和所有参数,以减少输入 void Name(Manifold *m, Body *a, Body * b)
一直。带有 extern 的那一行只是告诉编译器安静下来。
我没有得到的是 Collision.cpp 中的那段代码。所以这里列出了一些我不明白的事情。
首先,那些方括号是什么?肯定不是数组,因为他是这样用的
Dispatch[A->shape->GetType( )][B->shape->GetType( )]( this, A, B );
getType() 为您提供对象 A 中形状的枚举类型。其次,他们的 typedef 使它看起来像一个方法,但您可以为该方法分配一个值,或者这是您可以用 C++ 做的其他事情吗?这是如何工作的?
- 第三,我运行了该应用程序并且它运行正常,那么这实际上是如何在不向方法提供参数的情况下调用方法的呢?
- 第四,也是最后一点,他为什么要把
Shape::eCount
放在那个 block 里?
感谢您到目前为止的关注,我知道这很长,因为我不擅长解释。如果有人可以为此提供 Java 等效项(如果存在)或至少回答我上面提出的四个问题,我会更愿意。
提前致谢。
最佳答案
Firstly, what is with those square brackets? It definitely isn't an array, because he used it like this
Dispatch[A->shape->GetType( )][B->shape->GetType( )]( this, A, B );
是的,它是一个数组。它是函数指针的二维数组。
Secondly, they typedef makes this look like a method, yet you can assign a value to the method.
如前所述,它是一个数组。赋值使用相关函数指针初始化数组。
Thirdly, I ran the application and it worked, so how does this actually call the methods without even giving parameters to the methods?
它确实为方法提供了参数。这就是调用示例的 (this, A, B)
部分。
Fourthly, and finally, why did he put
Shape::eCount
inside that block?
这是一种枚举技巧,通常用于轻松获取定义的枚举数。当您有自动枚举值(从 0 开始)时,您可以使用它。所以eCircle
为0,ePoly
为1,eCount
为2为枚举总数(不包括eCount
这是一个特殊值,不打算用作实际形状)。
关于java - cpp - 调用基于枚举的函数? (解释或等效的java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36586864/