现在我的gui是抽象的,基本上有一个Bitmap类,它保留了原生位图类型的void *。它的工作方式是我有一个抽象的位图加载器,它返回一个void指针,指向给定路径字符串的图像数据。加载器是位图数据类型中的静态指针,由用户为所使用的后端设置。 Graphics类是抽象的,Gui类要求指向它的指针。当Graphics类的后端绘制图像时,它会执行以下操作:
void Allegro5GraphicsManager::drawImage( const Bitmap &bmp,
const Point &position,
const Point ®ionStart,
const Dimension ®ionSize,
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);
}
因此,你可以看到,mearly类型将虚空*转化为它需要的东西。
问题是我听说无效*在C ++中不是一个好主意。
我想到的另一个解决方案是Allegro5Bitmap,它将从Bitmap继承。
我使用这种方法的问题是用户必须在他们的代码上涂抹Allegro5Bitmap。这就破坏了我的API的概念,通过简单地用sdl管理器指针初始化Gui类,所有编写的代码都可以移植到其他后端,如sdl等。
我该怎么办?
由于
答案 0 :(得分:2)
不,这是糟糕的设计。 void *是你绝对想要在C ++中摆脱的东西。
我还不完全清楚你要解决的问题是什么。它只是抽象图像的I / O或绘制它们吗?
I / O问题的典型解决方案是使用ImageReader / ImageWriter抽象类。然后他们的实现基于图像类型或I / O后端。这些类基本上是Image对象的工厂。
之后您在代码中处理的内容仍然是通用图像(顺便说一句。您知道“位图”实际上是黑白图像吗?)。
注意:即使您需要使用不同类型的Image对象(派生),工厂也是解决问题的典型模式,同时在其他代码中保持通用。您从工厂获得一个Image对象,实际上是AllegroImage或其他任何类型。您只需在Image上调用基类方法,这样就不用理了。