包含不同数据的类的设计

时间:2014-01-25 09:03:46

标签: c++

我正在学习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
}

这不仅仅针对这个图像类,我一般很好奇如何设计包含不同数据成员的类。

谢谢。

2 个答案:

答案 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继承自ImageBMPImagePNGImage继承自{{1} }}

周围有许多库可以做很多这样的事情,允许将图形,矢量对象等渲染成多种格式。你可能不想使用一个大型的外部库,因为你这样做是为了自学,但你可能想看一下如何构建一个想法。 (请注意,某些图形库有理由拥有一个更加复杂和灵活的结构,然后你可能想要模仿。如果有很多层的抽象和继承,你无法跟踪它们,它可能不是最好的来源通过例子来学习。)