2

私はゲーム エンジン クラスをコーディングしています。この #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
    }
}

これらの方法には長所と短所があり、どの方法が好ましいですか?

4

2 に答える 2

0

基本クラス (CBaseApi) と同じ名前の typedef があるようです。それはうまくいきません。

次のような意味でしたか:

class CBaseAPI
{
    //abstract class, virtual functions
};
class COpenGlEs : public CBaseAPI
{
    // implementations  
};

#ifdef OGL
    typedef COpenGl BaseApiImpl;
#elif defined( OGLES )
    typedef COpenGlEs BaseApiImpl;
#elif defined( DX9 )
    typedef CDirectX9 BaseApiImpl;
#elif defined( DX10 )
    typedef CDirectX10 BaseApiImpl;
#elif defined( DX11 )
    typedef CDirectX11 BaseApiImpl;
#endif
于 2013-08-04T23:24:34.813 に答える
-1

2つ目はひどいです。2 フェーズの初期化は非常にエラーが発生しやすく、一般的に、実行時にゲームでレンダリング API を変更する必要はまったくありません。インターフェイスと継承を使用するのは時間とパフォーマンスの完全な無駄です。

#define の場合、継承によってクラスをリンクする必要はありません。テンプレートを使ったほうがうまくいくかもしれませんが、プリプロセッサは条件付きコンパイルのために作られたものです。簡単な使用シナリオ:

class OGL {
public:
    void dostuff();
};
class DX {
public:
    void dostuff();
};
class GameEngine {
#ifdef USE_OPENGL
    OGL BaseAPI;
#else
    DX BaseAPI;
#endif
public:
    void dostuff() { BaseAPI.dostuff(); }
};

また、Cクラス?ああ。バディ、新しい学習教材を見つける必要があります。

于 2013-08-04T23:26:54.077 に答える