質問

これは宿題ではなく、私のコードに関する質問です(私はC ++を学んでいます)。

クラスの複数のインスタンスがあります Renderer すべてが同じリソース、SDLによってロードされたBMPを使用しています。これは、クラスの共有リソースを管理する正しい方法ですか?そうでない場合、良いものは何ですか?はいの場合、より良いものはありますか?

renderer.hpp

class Renderer {
    public:
        Renderer(SDL_Surface *target_surface, int w, int h);
        Renderer(const Renderer& renderer);
        ~Renderer();
        // ...
    private:
        int w, h;
        SDL_Surface *target;

        static SDL_Surface *blocks;
        static int numinstances;
};

renderer.cpp

const char BLOCKS_FILE[] = "blocks.bmp";
SDL_Surface *Renderer::blocks = 0;
int Renderer::numinstances = 0;

Renderer::Renderer(SDL_Surface *target, int w, int h) {
    numinstances++;

    if (blocks == 0) {
        // temporary storage for file
        SDL_Surface *loadedimg = SDL_LoadBMP(BLOCKS_FILE);
        if (loadedimg != NULL) {
            blocks = SDL_DisplayFormat(loadedimg);
            SDL_FreeSurface(loadedimg);
        }

    }

    this->target = target;
    this->w = w;
    this->h = h;
}

Renderer::Renderer(const Renderer& renderer) {
    numinstances++;

    w = renderer.w;
    h = renderer.h;
    target = renderer.target;

}

Renderer::~Renderer() {
    numinstances--;

    if (numinstances == 0) {
        SDL_FreeSurface(blocks);
        blocks = 0;
    }
}
役に立ちましたか?

解決

これは、クラスの共有リソースを管理する正しい方法ですか?

はい、厳密に言えば a 正しい方法。しかし、それはあなたができるだけ早く離れて行くべきであるものです。いいえ、歩かないでください - 走ってください。振り返らないでください。

そうでない場合、良いものは何ですか?

似ているものを好む std::shared_ptr<> また boost::shared_ptr<>.

はいの場合、より良いものはありますか?

クラス内に静的な表面ポインターと静的リファレンスカウンターを持っている代わりに、1つを保管してください shared_ptr そこにある表面の場合は、作成します 一度 クラスの外で、レンダラーコンストラクターに渡します。そうすることのいくつかの利点:

(太字で編集:)

  • 考える必要はありません 最後の所有者であり、したがって、リソースの削除の責任者について shared_ptr あなたのためにそれをします。
  • スレッドの安全性
  • 多くの場合、コードが少ないことは、バグが少ないことを意味します。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top