Класс общего ресурса - правильное решение?
Это не домашняя работа, просто вопрос о моем коде (я изучаю C++).
У меня есть несколько экземпляров класса Renderer
что все используют один и тот же ресурс, BMP, загруженный SDL. Это правильный способ управления общим ресурсом для класса? Если нет, что хорошего? Если да, есть ли лучшие?
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;
}
}
1 ответ
Это правильный способ управления общим ресурсом для класса?
Да, строго говоря, это правильный путь. Но это тот, от которого вы должны уходить так быстро, как можете. Нет, не ходи - беги. И не оглядывайся назад.
Если нет, что хорошего?
Предпочитаю все, что напоминает std::shared_ptr<>
или же boost::shared_ptr<>
,
Если да, есть ли лучшие?
Вместо того чтобы указатель статической поверхности и счетчик статических ссылок внутри класса, просто оставьте один shared_ptr
для поверхности, создайте его один раз за пределами класса, а затем передайте его конструктору рендерера. Некоторые преимущества этого:
(Изменить жирным шрифтом:)
- Вам не нужно думать о том, кто последний владелец и, следовательно, отвечает за удаление ресурса, так как
shared_ptr
делает это для вас. - Поток безопасности
- Меньше кода часто означает меньше ошибок.