Recurso compartido de clase: ¿solución correcta?
-
29-10-2019 - |
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;
}
}
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.