2009-02-28 5 views
2

Je travaille actuellement sur un moteur de sprite en C++. J'ai une classe abstraite IEngine avec une fonction virtuelle init_api. Cela prend dans un vide *. J'ai alors une classe de moteur implémentée DirectX CEngineDX. Ce qui lance ensuite api_params à un D3DPRESENT_PARAMETERS *, donc il peut être utilisé pour initialiser DirectX.void * comme type de variable inconnue

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

Je suis très heureux avec cette configuration mais voulait obtenir d'autres programmeurs voir sur cette « solution » si vous voulez.

Bravo pour les réponses!

Carl

Répondre

1

Une autre façon de procéder est simplement d'avoir un en-tête commun et des fichiers * .cpp différents pour chaque implémentation. De cette façon, vous pouvez inclure uniquement les fichiers D3D ou simplement les fichiers OGL dans votre projet. IMO est préférable de choisir l'API au moment de la compilation afin de ne pas faire de lien avec les deux bibliothèques. En ce qui concerne le vide *, je ne l'aime pas vraiment. Je pense que vous feriez mieux de définir vos propres types puis de les mapper aux types d'API avec wrapper structures/classes et typedefs. Vous pouvez transmettre ces déclarations et mettre l'implémentation réelle dans vos fichiers * .cpp.

Un autre avantage de cette méthode est que vous ne payez pas pour les fonctions virtuelles dont vous n'avez pas besoin, bien que je réalise que le coût d'un appel virtuel est assez faible.

1

Ceci est un problème relativement fréquent avec la variation des types d'arguments dans les hiérarchies d'héritage; votre sous-classe veut spécialiser le type de 'api_params' de la classe parent. Je pense que c'est OK, mais c'est un C-like. Je pense que la meilleure solution serait de rendre non-virtuel init_api et l'implémenter avec le type correct dans la sous-classe. Quoi qu'il en soit, la structure D3DPRESENT_PARAMETERS n'a probablement de sens qu'avec le moteur DirectX, alors pourquoi ne pas l'avoir dans la sous-classe à laquelle elle appartient logiquement?

+0

Merci de votre participation. : P –

0

Je n'aime pas vraiment cette API. Pourquoi utiliser un pointeur vide? Pourquoi ne pas faire du premier paramètre un pointeur ou une référence à D3DPRESENT_PARAMETERS? Vous savez que c'est ce que ça devrait être de toute façon? Ceci est plus sûr de type.

1

Eh bien, vous pourriez utiliser des modèles (vous n'aimez pas les modèles), mais votre hiérarchie devra aller dans ce cas.

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; 
    } 
}; 

Mais, utilisez quelque chose qui s'intègre dans le grand schéma des choses.

Questions connexes