包含不同数据的类设计
Design of classes containing different data
我目前正在学习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
}
这不仅针对这个想象类,而且我通常很好奇我如何设计包含不同数据成员的类。
谢谢。
我同意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
}
希望这是一个有用的例子。我还要说,模板类可能非常有用,但是我会让您弄清楚这一点,因为我真的不想现在就进入。
祝你好运,让我知道我是否可以澄清我说的任何话。
我会说第二种方法绝对是您需要的。您基本上是在指定接口 - 您将在C 中使用抽象类。基类应包含您认为每个图像都应该能够提供的所有功能 - 可能是纯虚拟功能,因为没有"常规图像"以与任何图像相同的方式实现这些功能。(您可能有类似于每种图像类型的结构相同结构的常见元数据,并且可以通过基类中的方法处理这些结构。)
然后,每个类将根据其自己的私人数据来实现虚拟函数,以对该类型的图像有意义。如果某些图像类型共享一些但不是全部操作,则可以具有几层继承,例如RasterImage
从Image
和BMPImage
和CC_3和PNGImage
继承。
周围有很多图书馆可以做很多这些内容,以允许将图形,向量对象等渲染为多种格式。您可能不想使用大型外部图书馆,因为您正在这样做来教自己,但是您可能想看看一个人的结构来获得一些想法。(请注意,某些图形库将有理由具有更复杂和灵活的结构,您可能想模仿。如果有太多的抽象和继承层,您无法跟踪它们,那么它可能不是最好的来源从示例中学习。)
- 在运行时处理类型擦除的数据-如何不重新发明轮子
- 编译器上的策略数据结构不起作用
- C++ 写入路径名中包含不需要的空字符的文件
- 如果变量数据包含大于 vector 所有元素的整数,则仅在视觉工作室上接收"矢量下标超出范围"?
- 如何在进程之间共享大量数据而不重复?(国际刑罚委员会)
- Linux 大小命令,为什么 bss 和数据部分不为零?
- 无法打开包含文件'Graphics.hpp'没有这样的文件或目录,Visual Studio的其他包含不起作用
- 为什么静态数据成员不能在c++11中的类中初始化
- 标头包含不是 .c 程序所必需的,而是.cpp程序需要的
- 无法转换 .CATPart 文件.错误:输入文件路径似乎包含不支持的字符
- 如何通过串行终端检索数据而不破坏其在 GNU ARM 嵌入式中的基本值?
- 逐行从文件读取到矢量对于<T>二进制数据C++不正确
- 直接提供数据而不是文件路径
- 气泡排序不传递数据或不起作用
- C++ - 在类中包含不是类对象属性的变量是否是一种不好的做法
- 函数指针数组,其中包含不同类的类函数
- 使用折叠表达式初始化静态 constexpr 类数据成员不编译
- 芯片的数据表不说明如何与之通信
- 解析一般CSV读取功能时,如何处理不同的数据类型?(不明确指定它们)
- 如何处理错误“vtkTrivialProducer :此数据对象不包含请求的范围”