gpt4 book ai didi

c++ - 这是一个好的设计吗?

转载 作者:行者123 更新时间:2023-11-30 04:34:54 25 4
gpt4 key购买 nike

现在我的 gui 是抽象的,基本上有一个 Bitmap 类,它持有一个 void* 到 native 位图类型。它的工作方式是我有一个抽象位图加载器,它返回一个指向给定路径字符串的图像数据的空指针。加载程序是位图数据类型中的静态指针,由用户为使用的任何后端设置。 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 类型将 void* 转换为它需要的内容。

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

我想到的另一个解决方案是像 Allegro5Bitmap 这样的东西,它将继承自 Bitmap。

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

我能做什么?

谢谢

最佳答案

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

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

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

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

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

关于c++ - 这是一个好的设计吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5695683/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com