包含不同数据的类的设计 我目前正在学习C++,为此我正在编写一个简单的图像转换器。

包含不同数据的类的设计 我目前正在学习C++,为此我正在编写一个简单的图像转换器。,c++,C++,我希望有一个基本的图像类,它包含图像的不同内存,比如DXTn或BMP。 如何正确设计可以包含这些不同数据类型的类? 有没有更好的方法将内存存储在(智能)指针中 这不仅仅是这个imageclass特有的,我通常很好奇如何设计包含不同数据成员的类 谢谢。我想说,第二种方法绝对是您所需要的。基本上是指定接口——在C++中使用抽象类。基类应该包含您认为每个映像都应该能够提供的所有函数——可能是纯虚拟函数,因为没有“通用映像”以相同的方式为任何映像实现这些函数。(您可能有公共元数据之类的东西,它们对每种图

我希望有一个基本的图像类,它包含图像的不同内存,比如DXTn或BMP。 如何正确设计可以包含这些不同数据类型的类? 有没有更好的方法将内存存储在(智能)指针中

这不仅仅是这个imageclass特有的,我通常很好奇如何设计包含不同数据成员的类


谢谢。

我想说,第二种方法绝对是您所需要的。基本上是指定接口——在C++中使用抽象类。基类应该包含您认为每个映像都应该能够提供的所有函数——可能是纯虚拟函数,因为没有“通用映像”以相同的方式为任何映像实现这些函数。(您可能有公共元数据之类的东西,它们对每种图像类型都具有相同的结构,这些可以由基类中的方法处理。)

然后,每个类将基于其自己的私有数据实现虚拟函数,这些私有数据以对该类型图像有意义的方式存储。如果某些图像类型共享某些操作,但不是所有操作,则可以有多个继承层,例如
光栅图像
继承自
图像
BMPImage
PNGImage
继承自
光栅图像

有很多库做了很多这方面的工作,允许将图形、向量对象等渲染成多种格式。您可能不想使用大型外部图书馆,因为您这样做是为了自学,但您可能希望了解如何构建一个图书馆来获得一些想法。(请注意,有些图形库的结构可能更复杂、更灵活,您可能需要模仿。如果有太多抽象层和继承层,您无法跟踪它们,那么它可能不是通过示例学习的最佳来源。)我同意虚拟抽象界面会让你的生活更轻松

例如:

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
}
请记住,抽象类无法实例化,因为它没有实现。如果使用虚拟类而不是抽象类,理论上,如果需要,可以使用无类型图像类。您所需要做的就是为您的虚拟类提供一个基本的实现

例如:

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++时,您确实希望使用抽象基类,因为它们是OOP的基础。谢谢您的响应,非常感谢!查看其他源代码主要是我学习C++的方式,直到现在,不幸的是,没有一个库是足够简单的。使用基本抽象类时,是否需要一个管理器类来处理所有必需的内容?这样做的原因是我试图避免为每个派生类重载函数:
void进程(Image&img)//managerclass/baseclass?
代替:
作废流程(BMPImage&img)和<代码>无效流程(PNGImage和img)谢谢你的回答!我想你们都是对的,一个抽象基类应该是最好的选择。但是如何处理所有这些派生类呢?我不想重载所有接受图像作为参数的函数。我是否也必须为此设计一个manager类?您可以使用多态性来实现这一点。其基本思想是编写函数以接受基类,然后将其传递给派生类。这是可行的,因为所有图像类共享一个公共基类,因此都是“图像”,可以作为通用图像处理。我的替补角色现在有点生疏了,但我认为这会有所帮助。同样,您可以再次查看模板,但我对模板的理解目前还不够。