java - cpp - 调用基于枚举的函数? (解释或等效的java)

标签 java c++ c enums typedef

对于 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/

相关文章:

c++ - 如何通过对构造函数的引用传递对象

c - 什么更快,pipe|fifo

java - 在tomcat中部署和运行不同版本的war

java - 如何在收到通知时唤醒屏幕?

java - 如何调用一个类(在另一个类中)

c++ - 当使用标签调度存在自定义 CUDA 分配器时重载类新运算符

c++ - Qt,内存的动态分配

c - 分配给枚举的无效值会导致内存损坏吗?

比较函数在 qsort 中给出段错误

java - 如何在数据库JAVA中建立两个对象之间的关系