包含不同数据的类设计

Design of classes containing different data

本文关键字:数据 包含不      更新时间:2023-10-16

我目前正在学习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 中使用抽象类。基类应包含您认为每个图像都应该能够提供的所有功能 - 可能是纯虚拟功能,因为没有"常规图像"以与任何图像相同的方式实现这些功能。(您可能有类似于每种图像类型的结构相同结构的常见元数据,并且可以通过基类中的方法处理这些结构。)

然后,每个类将根据其自己的私人数据来实现虚拟函数,以对该类型的图像有意义。如果某些图像类型共享一些但不是全部操作,则可以具有几层继承,例如RasterImageImageBMPImage和CC_3和PNGImage继承。

周围有很多图书馆可以做很多这些内容,以允许将图形,向量对象等渲染为多种格式。您可能不想使用大型外部图书馆,因为您正在这样做来教自己,但是您可能想看看一个人的结构来获得一些想法。(请注意,某些图形库将有理由具有更复杂和灵活的结构,您可能想模仿。如果有太多的抽象和继承层,您无法跟踪它们,那么它可能不是最好的来源从示例中学习。)