我正在编写一个游戏引擎类,有人建议我添加这个#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
我有两个问题:我怎样才能使上述工作?
我试过:
class CBaseAPI
{
//abstract class, virtual functions
}
class COpenGL : public CBaseAPI
{
//implementations
}
但它并没有像我预期的那样工作。
第二个问题是,这种#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
}
}
这些方法有什么优点和缺点,首选的方法是什么?