Как использовать интеллектуальные указатели с растровыми изображениями Allegro?

Я решил, что устал решать, какие классы отвечают за удаление растровых изображений. Я попытался переписать свой код, чтобы использовать интеллектуальные указатели с пользовательским средством удаления al_destroy_bitmap

Мой код довольно прост.

shared_ptr<ALLEGRO_BITMAP> test = make_shared<ALLEGRO_BITMAP>(al_load_bitmap("hello.png"), al_destroy_bitmap);

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

error C2079: 'std::_Get_align<ALLEGRO_BITMAP>::Elt2' uses undefined struct 'ALLEGRO_BITMAP'
error C2079: 'std::_Get_align<ALLEGRO_BITMAP>::Elt0' uses undefined struct 'ALLEGRO_BITMAP'
error C2027: use of undefined type 'ALLEGRO_BITMAP'
error C2027: use of undefined type 'ALLEGRO_BITMAP'

Другими решениями для решения моей проблемы было бы создание класса Bitmap для обертывания всего материала Allegro, но это кажется уродливым, и я не думаю, что мне нужно это делать. Плюс я уже везде использую другие allegro функции, а то хотелось бы потом написать те же типы классов для ALLEGRO_SAMPLE и ALLEGRO_FONT. Мне действительно не хочется этого делать.

Как использовать интеллектуальные указатели с растровыми изображениями Allegro?

Изменить: возможно, чтобы дать кодировщикам, не использующим Allegro, представление о том, как работают ALLEGRO_BITMAP, я опубликую небольшой код ниже.

ALLEGRO_BITMAP *test = al_load_bitmap("hello.png") // This works
ALLEGRO_BITMAP test1; // This fails with error C2079 undefined struct ALLEGRO_BITMAP. I expect this here.

person DeepDeadpool    schedule 02.08.2015    source источник


Ответы (1)


Так:

std::shared_ptr<ALLEGRO_BITMAP> test(al_load_bitmap("hello.png"), al_destroy_bitmap);

Помните: make_shared и make_unique звоните new, вам здесь это не нужно.

Также make_x<T> конструирует объект типа T, передавая заданные аргументы конструктору T. Но al_load_bitmap возвращает указатель на полностью сконструированный объект, поэтому вам не нужно вызывать какой-либо конструктор (кроме конструктора интеллектуального указателя).

person emlai    schedule 02.08.2015