cpp: ¿llamar a una función basada en enumeraciones? (explicación o java equivilent)

Soy un novato total cuando se trata de cualquier lenguaje en la familia C de lenguajes de programación (C, C ++, C #, etc.).

Estoy tratando de entender los conceptos básicos sobre cómo funciona un motor de física, y encontré el tutorial de Randy Gaul sobre cómo hacer un motor de física 2D desde cero. Descargué el código fuente de este repositorio e intenté entender lo que estaba sucediendo. Soy un programador Java decente (no el mejor), así que sé lo que está pasando, hasta que llegue a esta sección.

Hay una enumeración en una estructura / clase llamada forma:

struct Shape
{
  enum Type
  {
    eCircle,
    ePoly,
    eCount
  };
...
}

Y luego más tarde en Collision.h:

typedef void (*CollisionCallback)( Manifold *m, Body *a, Body *b );
extern CollisionCallback Dispatch[Shape::eCount][Shape::eCount];

en Collision.cpp:

CollisionCallback Dispatch[Shape::eCount][Shape::eCount] =
{
  {
    CircletoCircle, CircletoPolygon
  },
  {
    PolygontoCircle, PolygontoPolygon
  },
};

CircletoCircle, CircletoPolygon, PolyontoCircle, PolygontoPolygon son todas las funciones que están en la forma functionName( Manifold *m, Body *a, Body *b )

Desde mi pobre comprensión, creo que este tipo declaró un tipo que devuelve vacío llamado CollisionCallBack con todos los parámetros, para ahorrar algo de dolor al escribir void Name(Manifold *m, Body *a, Body *b)todo el tiempo. La línea con el exterior es solo para decirle al compilador que se calle.

Lo que no entiendo es esa porción de código en Collision.cpp. Así que aquí hay una lista de cosas sobre esto que no entiendo.

  • En primer lugar, ¿qué pasa con esos corchetes? Definitivamente no es una matriz, porque la usó así Dispatch[A->shape->GetType( )][B->shape->GetType( )]( this, A, B );getType () le da el tipo de enumeración que tiene la forma en el objeto A.

  • En segundo lugar, typedef hace que parezca un método, pero puede asignar un valor al método, ¿o es algo más que puede hacer con C ++? ¿Como funciona esto?

  • En tercer lugar, ejecuté la aplicación y funcionó, entonces, ¿cómo se llama realmente a los métodos sin siquiera dar parámetros a los métodos?
  • Cuarto, y finalmente, ¿por qué puso Shape::eCountdentro de ese bloque?

Gracias por su atención hasta ahora, sé que esto es muy largo, porque soy terrible para explicarlo. Preferiría que alguien pudiera proporcionarme un Java Equivilent (si existe) para esto o al menos responder las cuatro preguntas que hice anteriormente.

Gracias por adelantado.

Respuesta 1

En primer lugar, ¿qué pasa con esos corchetes? Definitivamente no es una matriz, porque lo usó asíDispatch[A->shape->GetType( )][B->shape->GetType( )]( this, A, B );

Sí, es una matriz. Es una matriz bidimensional de punteros de función.

En segundo lugar, typedef hace que parezca un método, pero puede asignar un valor al método.

Como se mencionó anteriormente, es una matriz. La asignación inicializa la matriz con los punteros de función relevantes.

En tercer lugar, ejecuté la aplicación y funcionó, entonces, ¿cómo se llama realmente a los métodos sin siquiera dar parámetros a los métodos?

Se le dan los parámetros a los métodos. Esa es la (this, A, B)parte de su ejemplo de invocación.

Cuarto, y finalmente, ¿por qué puso Shape::eCountdentro de ese bloque?

Ese es un truco de enumeración comúnmente utilizado para obtener fácilmente la cantidad de enumeraciones definidas. Lo usa cuando tiene valores de enumeración automática (que comienzan en 0). Entonces eCirclees 0, ePolyes 1 y eCountes 2, que es el número total de enumeraciones (sin incluir eCountcuál es un valor especial que no está destinado a ser utilizado como una forma real).

Respuesta: 2

El typedef declara CollissionCallbackser un tipo discreto. El tipo es un puntero a una función que toma los tres parámetros enumerados y luego devuelve a void.

Dispatches una declaración regular de matriz bidimensional. Abusa del hecho de que los enumvalores están numerados consecutivamente a partir de 0:

  enum Type
  {
    eCircle,
    ePoly,
    eCount
  };

Después de todo lo dicho y hecho, el enum Type's eCirclees equivalente a 0, ePolya 1 y eCounta 2. Los valores en un enum, por defecto, están numerados comenzando en 0, por lo que la declaración de matriz es realmente equivalente a:

 CollisionCallback Dispatch[2][2] =

... y se inicializa con punteros a funciones. Recuerde que CollissionCallbackes un tipo que apunta a una función.

Esta es una forma algo hacky de inicializar una matriz 2x2 de punteros de función, eso es todo.

Respuesta: 3

Estoy usando la biblioteca Apache XML-RPC para obtener errores de Bugzilla. Al llamar al servicio, recibo una excepción: org.apache.xmlrpc.client.XmlRpcClientException: no se pudo analizar la respuesta del servidor: un XML no válido ...

Soy nuevo en el desarrollo de servicios web en Java (anteriormente los hice en PHP y Ruby). Estoy escribiendo un recurso que tiene el siguiente formato: <URL> / myService / <domain> / <app_name> / & ...

Estoy escribiendo una araña web muy básica en Java. Me enfrento a un problema, que el contenido cargado para la misma URL es diferente al del navegador. Por ejemplo, intente debajo de la URL. http: //www.google.co.in/search? ...

Tenemos dos versiones de Java en nuestro servidor Java 1.6 y Java 1.7. ¿Hay alguna manera de averiguar cuáles son las aplicaciones que se ejecutan en la máquina que llama a la versión? Nuestro requisito es ...