包含不同数据的类的设计 我目前正在学习C++,为此我正在编写一个简单的图像转换器。
我希望有一个基本的图像类,它包含图像的不同内存,比如DXTn或BMP。 如何正确设计可以包含这些不同数据类型的类? 有没有更好的方法将内存存储在(智能)指针中 这不仅仅是这个imageclass特有的,我通常很好奇如何设计包含不同数据成员的类包含不同数据的类的设计 我目前正在学习C++,为此我正在编写一个简单的图像转换器。,c++,C++,我希望有一个基本的图像类,它包含图像的不同内存,比如DXTn或BMP。 如何正确设计可以包含这些不同数据类型的类? 有没有更好的方法将内存存储在(智能)指针中 这不仅仅是这个imageclass特有的,我通常很好奇如何设计包含不同数据成员的类 谢谢。我想说,第二种方法绝对是您所需要的。基本上是指定接口——在C++中使用抽象类。基类应该包含您认为每个映像都应该能够提供的所有函数——可能是纯虚拟函数,因为没有“通用映像”以相同的方式为任何映像实现这些函数。(您可能有公共元数据之类的东西,它们对每种图
谢谢。我想说,第二种方法绝对是您所需要的。基本上是指定接口——在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类?您可以使用多态性来实现这一点。其基本思想是编写函数以接受基类,然后将其传递给派生类。这是可行的,因为所有图像类共享一个公共基类,因此都是“图像”,可以作为通用图像处理。我的替补角色现在有点生疏了,但我认为这会有所帮助。同样,您可以再次查看模板,但我对模板的理解目前还不够。