Ressource partagée de classe - Solution correcte?
-
29-10-2019 - |
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;
}
}
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.