Pregunta

Esta no es tarea, solo una pregunta sobre mi código (estoy aprendiendo C ++).

Tengo múltiples instancias de la clase Renderer Todos usan el mismo recurso, un BMP cargado por SDL. ¿Es esta una forma correcta de administrar un recurso compartido para una clase? Si no, ¿qué es bueno? Si es así, ¿hay mejores?

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;
    }
}
¿Fue útil?

Solución

¿Es esta una forma correcta de administrar un recurso compartido para una clase?

Sí, estrictamente hablando es a forma correcta. Pero es uno del que debes alejarte lo más rápido posible. No, no camines, corre. Y no mires hacia atrás.

Si no, ¿qué es bueno?

Prefiere cualquier cosa que se parezca std::shared_ptr<> o boost::shared_ptr<>.

Si es así, ¿hay mejores?

En lugar de tener un puntero de superficie estática y un contador de referencia estático dentro de la clase, solo mantén uno shared_ptr Para la superficie allí, creala una vez fuera de la clase y luego pasarlo al constructor de renderizador. Algunos beneficios de hacerlo:

(Editar en negrita:)

  • No necesitas pensar sobre quién es el último propietario y, por lo tanto, responsable de la eliminación de recursos, ya que shared_ptr hace eso por ti.
  • Seguridad
  • Menos código a menudo significa menos errores.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top