реализация библиотеки для классов подсчета ссылок - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть такой класс:

Texture
{
    int ID
public:
    Texture(std::string name){ ID = make_texture(name); }
    ~Texture(){ delete_texture(ID); }
};

но проблема в том, что когда я перемещаю класс, вызывается деструктор, поэтому идентификатор становится недействительным.

моя текущая реализация будет выглядеть примерно так:

Texture
{
    static std::unordered_map<int> m;
    int ID
public:
    Texture(std::string name){
        ID = make_texture(name);
        m[ID]++;
    }
    Texture(Texture& obj){ *this = obj; }
    Texture &operator=(Texture& obj){
        ID = obj.ID;
        m[ID]++;
    }
    ~Texture(){
        if (!--m[ID])
            delete_texture(ID);
    }
};
//was coded in stack overflow so syntax may be a bit off

но что действительно хорошо, так это класс, от которого я мог бы унаследовать:

Texture : public ref_count<int>
{
    int ID
public:
    Texture(std::string name){ ID = make_texture(name); }
    key(){return ID;} // inherited from ref_count
    on_delete(){ delete_texture(ID); } // inherited from ref_count
};

поэтому мой вопрос: существует ли такой удобный класс в стандартной библиотеке / бусте? Или каков наилучший способ достичь этого без применения собственного подсчета ссылок.

1 Ответ

0 голосов
/ 03 сентября 2018

Чтобы расширить мой комментарий. Вам нужно, чтобы Texture объекты были общими ссылками на один и тот же ID, поэтому ID необходимо обернуть в некоторый тип подсчета ссылок для хранения Texture. Это именно тот случай использования std::shared_ptr. Все, что вам нужно, это пользовательское средство удаления , которое будет delete_texture как часть освобождения управляемого целого числа.

class Texture
{
    std::shared_ptr<int> ID;
public:
    Texture(std::string name) :
      ID{ new int(make_texture(name)),
          [](int* id_ptr) {
            delete_texture(*id_ptr);
            delete id_ptr;
          }
        }
    {}
};

И это все. Копия / перемещение / dtor Texture теперь может быть неявно сгенерирована компилятором, поскольку она зависит от правильного поведения std::shared_ptr.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...