0

SDL 2.0 を使用して簡単なゲームを書きたいと思います。その構造は次のようになります。

  • コンストラクタで SDL(SDL.Init() ) を初期化し、デストラクタで SDL_Quit() を呼び出し、Window と Texture のインスタンスを含むクラス Engine
  • class Texture - SDL_Texture* のラッパー クラス。作成時にテクスチャを作成し、デストラクタでテクスチャを破棄する
  • class Window - SDL_Window のラッパー クラスで、最初に SDL_Window* と SDL_Renderer* を作成し、デストラクタで削除します。

さて、私の知る限り、SDL_Quit() は dll をアンロードし、すべてのサブシステムを閉じます。私の理解が正しければ、SDL_Quit() を呼び出しても、SDL_DestroyWindow()、SDL_DestroyRenderer()、および SDL_DestroyTexture() を呼び出しても、何の効果も原因もありません。システムが dll と同様にアンロードされているため、バグです。

したがって、SDL_Quit() が呼び出される前に、Engine のデストラクタの最初で、Engine 内の Texture と Window が破棄されることを望みます。

単純なクラスの例でシミュレートしようとすると、単純な LIFO 応答が得られました。

ClassOne オブジェクトの初期化

ClassTwo オブジェクトの初期化

集約オブジェクトが初期化されました

集約オブジェクトが破棄されました

ClassTwo オブジェクトの破壊

ClassOne オブジェクトの破壊

そして、それは私が望むものではありません。ポインターと動的メモリ割り当てを使用して、問題を解決することができました。Aggregate のコンストラクターで演算子 new を使用してそれらを作成し、デストラクターで演算子 delete を使用してそれらを破棄するだけです。

しかし、ポインタを使わずにそれを行う他の方法はありますか? 前もって感謝します。

4

2 に答える 2

1

クラスを適切に並べ替えると、目的の破棄順序が得られます。

クラスで:

class X {
   public:
   X()
   // This order is not relevant and should produce a compiler warning
   : ..., c(), b(), a()
   {}


   private:
   // The members are initialized in this order and destructed in the opposite order.
   A a;
   B b;
   C c
   ...
}

単一の (!) 翻訳単位の静的インスタンスにも同じことが当てはまります: 定義の逆順での構築と破棄。

複数の翻訳単位がある場合、各単位が初期化される順序は指定されていません。関数に静的データがあると、それが楽になります。データは最初の関数呼び出しで初期化されます。

于 2013-08-31T16:56:07.000 に答える