Класс общего ресурса - правильное решение?

Это не домашняя работа, просто вопрос о моем коде (я изучаю 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 делает это для вас.
  • Поток безопасности
  • Меньше кода часто означает меньше ошибок.
Другие вопросы по тегам