Это хороший дизайн? - PullRequest
       9

Это хороший дизайн?

1 голос
/ 17 апреля 2011

Прямо сейчас мой графический интерфейс абстрактен и в основном имеет класс Bitmap, который содержит пустоту * по отношению к собственному типу растрового изображения. Это работает так: у меня есть загрузчик абстрактных растровых изображений, который возвращает пустой указатель на данные изображения с заданной строкой пути. загрузчик является статическим указателем в типе данных Bitmap и устанавливается пользователем для любого используемого бэкэнда. Класс Graphics является абстрактным, и указатель на него запрашивается классом Gui. Когда бэкэнд для класса Graphics рисует изображение, он делает что-то вроде этого:

void Allegro5GraphicsManager::drawImage( const Bitmap &bmp,
                                            const Point &position,
                                            const Point &regionStart,
                                            const Dimension &regionSize,
                                            const float &opacity /*= 1.0f*/ )
{
    al_draw_tinted_bitmap_region((ALLEGRO_BITMAP*)bmp.getBitmap(),
        al_map_rgba_f(opacity,opacity,opacity,opacity),
        regionStart.getX(),regionStart.getY(),
        regionSize.getWidth(),regionSize.getHeight(),
        position.getX() + getOffset().getX(),position.getY() + getOffset().getY(), 0);
}

Так что, как вы можете видеть, просто тип бросает пустоту * в то, что ему нужно.

Проблема в том, что я слышал, что void * не очень хорошая идея в C ++.

Другое решение, о котором я подумал, - это что-то вроде Allegro5Bitmap, которое наследуется от Bitmap.

Проблема, с которой я столкнулся при использовании этого метода, заключалась в том, что пользователю пришлось бы намазать Allegro5Bitmap по всему коду. И это опровергает концепцию моего API, которая предназначена для переноса всего кода, написанного для переноса на другие серверные части, такие как sdl и т. Д., Путем простой инициализации класса Gui с помощью указателей менеджера sdl.

Что я мог сделать?

Спасибо

1 Ответ

2 голосов
/ 17 апреля 2011

Нет, это плохой дизайн.void * - это то, от чего вы определенно хотите избавиться в C ++.

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

Типичное решение проблемы ввода-вывода - использование абстрактных классов ImageReader / ImageWriter.Тогда их реализации основаны на типе изображения или бэкэнде ввода / вывода.Эти классы в основном являются фабриками для объектов Image.

То, что вы обрабатываете в своем коде впоследствии, все еще является универсальным Image (кстати, вы знаете, что «растровое изображение» на самом деле является черно-белым изображением?).

Примечание: Даже если вам нужны разные типы объектов Image (деривации), фабрика является типичным шаблоном для решения вашей проблемы, оставаясь при этом универсальным в другом коде.Вы получаете объект Image с завода, который фактически является AllegroImage или любым другим типом.Вы вызываете только методы базового класса на изображении, поэтому вам все равно.

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