Класс общего ресурса - правильное решение? - PullRequest
0 голосов
/ 05 мая 2011

Это не домашняя работа, просто вопрос о моем коде (я изучаю 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 Ответ

2 голосов
/ 05 мая 2011

Это правильный способ управления общим ресурсом для класса?

Да, строго говоря, это правильный путь. Но это тот, от которого вы должны уходить так быстро, как можете. Нет, не ходи - беги. И не оглядывайся назад.

Если нет, что хорошего?

Предпочитайте все, что напоминает std::shared_ptr<> или boost::shared_ptr<>.

Если да, есть ли лучшие?

Вместо наличия статического указателя на поверхность и статического счетчика ссылок внутри класса, просто оставьте один shared_ptr для поверхности, создайте его один раз вне класса и затем передайте его средству визуализации. конструктор. Некоторые преимущества этого:

( Изменить жирным шрифтом: )

  • Вам не нужно думать о том, кто последний владелец и, следовательно, отвечает за удаление ресурса, поскольку shared_ptr делает это за вас.
  • Безопасность потока
  • Меньше кода часто означает меньше ошибок.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...