Question

Ce n'est pas des devoirs, juste une question sur mon code (j'apprends C ++).

J'ai plusieurs instances de la classe Renderer tous utilisent la même ressource, un BMP chargé par SDL. Est-ce une façon correcte de gérer une ressource partagée pour une classe? Sinon, qu'est-ce qui est bon? Si oui, y en a-t-il de meilleurs?

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;
};

rendu.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;
    }
}
Était-ce utile?

La solution

Est-ce une façon correcte de gérer une ressource partagée pour une classe?

Oui, à proprement parler, c'est un façon correcte. Mais c'est celui que vous devriez vous éloigner aussi vite que possible. Non, ne marche pas - courez. Et ne regarde pas en arrière.

Sinon, qu'est-ce qui est bon?

Préférer tout ce qui ressemble std::shared_ptr<> ou boost::shared_ptr<>.

Si oui, y en a-t-il de meilleurs?

Au lieu d'avoir un pointeur de surface statique et un comptoir de référence statique à l'intérieur de la classe, gardez simplement un shared_ptr Pour la surface là-bas, créez-le une fois que En dehors de la classe, puis passez-le au constructeur de rendu. Quelques avantages de le faire:

(Modifier en gras:)

  • Tu n'as pas besoin de penser sur qui est le dernier propriétaire et donc responsable de la suppression des ressources, puisque shared_ptr fait ça pour vous.
  • Sécurité en filetage
  • Moins de code signifie souvent moins de bogues.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top