Pregunta

Actualmente estoy trabajando en un motor de sprites en C ++. Tengo una iEngine clase abstracta con una init_api función virtual. Esto toma en un void *.

    //  Initialise the engines' API
//  api_params - void* to api parameters for initalisation
//  hWnd - window handle
virtual bool init_api( void* api_params, HWND hWnd ) = 0;

Entonces tengo una clase de motores DirectX implementado CEngineDX. Que luego se arroja a un api_params D3DPRESENT_PARAMETERS *, por lo que puede usarse para inicializar DirectX.

//  Cast api_params to a D3DPRESENT_PARAMETERS
D3DPRESENT_PARAMETERS* presentParams = NULL;
presentParams = reinterpret_cast< D3DPRESENT_PARAMETERS* >( api_params );

Estoy muy feliz con esta configuración, pero quería obtener algunos otros programadores ver en esta "solución" si lo desea.

Los aplausos por las respuestas!

Carl

¿Fue útil?

Solución

Otra manera de hacerlo es simplemente tener una cabecera común y diferentes archivos * .cpp para cada aplicación. De esa manera se puede incluir sólo el D3D o sólo los archivos OGL en su proyecto. OMI es mejor elegir la API en tiempo de compilación por lo que su no vinculación contra ambas bibliotecas.

En cuanto a la void *, no me gusta mucho. Creo que sería mejor definir sus propios tipos y luego referirse a los tipos de API con la envoltura structs / clases y typedefs. Puede reenviar declarar estos, y poner la aplicación real en sus archivos .cpp *.

Otra ventaja de este método es que el no pagar por funciones virtuales que no es necesario, aunque me di cuenta el costo de una llamada virtual es bastante pequeña.

Otros consejos

Este es un problema relativamente común con la variación de los tipos de argumentos en jerarquías de herencia; la subclase quiere especializarse del tipo de '' api_params de la clase padre.

Creo que esto está bien, pero es similar a C. Creo que la mejor solución sería hacer init_api no virtual y ponerlo en práctica con el tipo correcto de la subclase. De todos modos, lo más probable es que la estructura D3DPRESENT_PARAMETERS sólo tiene sentido con el motor de DirectX, ¿por qué no tenerlo en la subclase que le corresponde lógicamente a?

Bueno, se podría utilizar plantillas (es que no le gusta yesos), pero la jerarquía tendrá que ir en ese caso.

template<class T>
struct Engine {
   bool init_api(const T& params, HWND hWnd);
};

//specialize for DirectX
template<>
struct Engine <D3DPRESENT_PARAMETERS> {
  bool init_api(const D3DPRESENT_PARAMETERS& params, HWND hWnd) {
    return true;
  }
};

Sin embargo, usar algo que encaja en el gran esquema de las cosas.

No me gusta mucho esta API. ¿Por qué utilizar un puntero nulo? ¿Por qué no hacer que el primer parámetro un puntero o referencia a D3DPRESENT_PARAMETERS? Usted sabe que es lo que debería ser de todos modos ¿verdad? Esto es más de tipo seguro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top