私はゲーム エンジン クラスをコーディングしています。この #define を追加して、複数の API をこの方法で処理するよう提案されました。
#ifdef OGL
typedef COpenGl CBaseApi;
#elif defined( OGLES )
typedef COpenGlEs CBaseApi;
#elif defined( DX9 )
typedef CDirectX9 CBaseApi;
#elif defined( DX10 )
typedef CDirectX10 CBaseApi;
#elif defined( DX11 )
typedef CDirectX11 CBaseApi;
#endif
2 つの質問があります。上記を機能させるにはどうすればよいですか?
私は試した:
class CBaseAPI
{
//abstract class, virtual functions
}
class COpenGL : public CBaseAPI
{
//implementations
}
しかし、それは私が期待したようには機能しませんでした。
2 番目の質問は、この #define メソッドは何らかのファクトリを使用するよりも優れているかどうかです。私は最初にこれをしていました:
//inside the Main program
myGameEngine.Initialize(GraphicAPI::DirectX11);
//inside the Initialize function
void GameEngine::Initialize(GraphicAPI graphicAPI)
{
switch(graphicAPI)
{
case GraphicAPI::DirectX11:
{
//Defined as private members:
//BaseAPI graphicAPI;
//class CDirectX11 : public BaseAPI
graphicAPI = new CDirectX11();
}
//other cases here
}
}
これらの方法には長所と短所があり、どの方法が好ましいですか?