我正在学习C ++,为此我正在编写一个简单的图像转换器。
我希望有一个基本图像类,其中包含图像的不同记忆布局,例如DXTn或BMP。 如何正确设计可以包含这些不同数据类型的类? 有没有更好的方法将内存存储在(智能)指针中?
class Image
{
public:
void loadDXT() { }
void loadBMP() { }
private:
char* data1;
std::unique_ptr< char* > data2;
}
或者从简单的基类派生更具体的类会更好:
class baseImage
{
public:
enum imgType { BMP , DXT };
void load() = 0;
}
class BMPImage : public baseImage
{
//bmp specific stuff here
}
这不仅仅针对这个图像类,我一般很好奇如何设计包含不同数据成员的类。
谢谢。
答案 0 :(得分:1)
我同意jwg虚拟抽象界面会让您的生活更轻松。
例如:
class BaseImage//base class
{
public:
virtual void DoThingsRelatedToAllImages_1()=0;
virtual void DoThingsRelatedToAllImages_2()=0;
//...and so on and whatever else
private:
int DataUsedForAllImageTypes;
};
//this is our child class
class Bmp: public BaseImage
{
private:
int DataUsedOnlyForBmpTypeImages;
};
void Bmp::DoThingsRelatedToAllImages_1()
{
//Do Whatever this function should do for a bitmap
}
void Bmp::DoThingsRelatedToAllImages_2()
{
//Do Whatever this function should do for a bitmap
}
请记住,抽象类无法实例化,因为它没有实现。如果你使用虚拟类而不是抽象类,理论上你可以使用无类型图像类来处理它。您需要做的只是为您的虚拟类提供基本实现。
例如:
class BaseImage//base class
{
public:
virtual void DoThingsRelatedToAllImages_1();
virtual void DoThingsRelatedToAllImages_2();
//...and so on and whatever else
private:
int DataUsedForAllImageTypes;
};
void BaseImage::DoThingsRelatedToAllImages_1()
{
//Do Whatever this function should do for a base image
}
void BaseImage::DoThingsRelatedToAllImages_2()
{
//Do Whatever this function should do for a base image
}
//this is our child class
class Bmp: public BaseImage
{
private:
int DataUsedOnlyForBmpTypeImages;
};
void Bmp::DoThingsRelatedToAllImages_1()
{
//Do Whatever this function should do for a bitmap
}
void Bmp::DoThingsRelatedToAllImages_2()
{
//Do Whatever this function should do for a bitmap
}
希望这是一个有用的例子。 我还会说模板类可能非常有用,但我会让你想出来,因为我现在不想进入那个。
祝你好运,如果我能澄清我说的话,请告诉我。答案 1 :(得分:0)
我会说第二种方法绝对是你需要的。您基本上是指定一个接口 - 您将在C ++中使用抽象类。基类应该包含您认为每个图像应该能够提供的所有函数 - 可能作为纯虚函数,因为没有'通用图像'以任何图像的相同方式实现这些功能。 (对于每种图像类型,您可能会有类似公共元数据的结构,这些结构可以通过基类中的方法处理。)
然后每个类将基于其自己的私有数据实现虚拟函数,这些私有数据以对该类型图像有意义的方式存储。如果某些图像类型共享一些但不是所有操作,则可以有多个继承层,例如RasterImage
继承自Image
,BMPImage
和PNGImage
继承自{{1} }}
周围有许多库可以做很多这样的事情,允许将图形,矢量对象等渲染成多种格式。你可能不想使用一个大型的外部库,因为你这样做是为了自学,但你可能想看一下如何构建一个想法。 (请注意,某些图形库有理由拥有一个更加复杂和灵活的结构,然后你可能想要模仿。如果有很多层的抽象和继承,你无法跟踪它们,它可能不是最好的来源通过例子来学习。)