这是一个很好的设计吗?

时间:2011-04-17 18:56:51

标签: c++ api user-interface

现在我的gui是抽象的,基本上有一个Bitmap类,它保留了原生位图类型的void *。它的工作方式是我有一个抽象的位图加载器,它返回一个void指针,指向给定路径字符串的图像数据。加载器是位图数据类型中的静态指针,由用户为所使用的后端设置。 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);
}

因此,你可以看到,mearly类型将虚空*转化为它需要的东西。

问题是我听说无效*在C ++中不是一个好主意。

我想到的另一个解决方案是Allegro5Bitmap,它将从Bitmap继承。

我使用这种方法的问题是用户必须在他们的代码上涂抹Allegro5Bitmap。这就破坏了我的API的概念,通过简单地用sdl管理器指针初始化Gui类,所有编写的代码都可以移植到其他后端,如sdl等。

我该怎么办?

由于

1 个答案:

答案 0 :(得分:2)

不,这是糟糕的设计。 void *是你绝对想要在C ++中摆脱的东西。

我还不完全清楚你要解决的问题是什么。它只是抽象图像的I / O或绘制它们吗?

I / O问题的典型解决方案是使用ImageReader / ImageWriter抽象类。然后他们的实现基于图像类型或I / O后端。这些类基本上是Image对象的工厂。

之后您在代码中处理的内容仍然是通用图像(顺便说一句。您知道“位图”实际上是黑白图像吗?)。

注意:即使您需要使用不同类型的Image对象(派生),工厂也是解决问题的典型模式,同时在其他代码中保持通用。您从工厂获得一个Image对象,实际上是AllegroImage或其他任何类型。您只需在Image上调用基类方法,这样就不用理了。