2

私はゲーム フレームワークを書いており、レンダラーのようなプラットフォームに依存するコードを一般化してカプセル化して、移植を少し簡単にしようとしています。フレームワークをきれいに使用しながら、これを達成しようとしています。現在、静的変数と名前空間に問題があります...

    // Renderer.h

    名前空間レンダラー
    {
        static IRenderer* g_pRenderer = NULL;

        static IRenderer* Get(void) { return g_pRenderer; }

        static IRenderer* CreateD3DRenderer()
        {
            g_pRenderer = new RendererD3D(); // IRenderer から派生
            g_pRenderer を返します。
        }
    }

したがって、私のmain()では、呼び出すことができCreateD3DRenderer()、インスタンスを正常に返します。g_pRenderer関数のスコープ内で作成されて返されているため、値を保持しています...ただし、 . をRenderer::Get()返しますNULL'static'init of から削除するg_pRendererと、他のファイルで使用すると衝突が発生します。

どうしたの?

4

2 に答える 2

2

まず、引数リストの void は C でのみ必要です。C++ では、単にGet().

主な質問に関しては、static変数はコンパイル単位に制限されています。それらをヘッダーに配置するため、それが含まれるすべてのコンパイル単位 (つまり、すべての cpp ファイル) に対して個別の変数が作成されます。パーツを削除するstaticと、同じ名前の変数が複数あり、リンク エラーが発生するため、エラーが発生します。

複数のファイル間で 1 つの変数を共有する場合は、extern. ただし、これは悪い習慣と見なされます。そのようなグローバル変数は必要ないので、リファクタリングしたほうがよいでしょう。

于 2013-01-14T05:22:55.747 に答える
2

代わりに、関数のすべての定義を.cppファイルに保持する必要があります。.h

何が起こっているかというと、 static がそのように使用されると、関数または変数がその.cppファイルに制限されます。つまり、ファイルg_pRendererごとに異なり.cppます。各定義は 1 つのファイルに制限されているため、複数の定義は発生しません.cpp

グローバルポインターを機能させるには、それを削除する必要があります。ゲッター関数で静的を保持できますが、削除します。関数の定義とグローバル変数を.cppファイルに移動し、それぞれの宣言のみを.h. 変数を として宣言しますextern

于 2013-01-14T05:23:16.170 に答える