我需要一些关于 Image 类层次结构的设计建议。
目前,我有两种类型的图像(一种是标准图像,第二种不包含标准图像数据)。
有时我希望对象为图像数据分配内存,而其他时候我只是希望它指向它。
当我想为 TypeA 图像赋予特定功能时,问题就出现了。
如果 TypeA 图像继承自图像,我将不得不复制已分配图像与未分配图像的功能。
我确信有更好的方法来做到这一点,我记得在大学期间有一些使用 mixins 的优雅解决方案,但在这里找不到使用它的方法。
我目前的设计是这样的:
class Image
{
public:
Image(int width, int height, int bpp);
virtual ~Image() {};
// getters
template <typename T>
T* ptr() { return reinterpret_cast<T*>(m_imageData); } // T depends on bpp
protected:
// metadata
char* m_imageData;
};
class AllocImage : public Image
{
public:
AllocImage(int width, int height, int bpp, DataType dataType) :
Image(width, height, bpp, dataType)
{
m_imageData = new char[m_dataSize];
}
~AllocImage()
{
delete m_imageData;
}
};
class ImageHolder : public Image
{
public:
ImageHolder(int width, int height, int bpp, DataType m_dataType);
void setPtr(const void* ptr);
};
class AllocatedImageTypeA : public AllocImage
{
public:
// Type A specific methods
};
class NonAllocatedImageTypeA : public ImageHolder
{
public:
// duplicated Type A specific methods
};
最佳答案
如果所有差异都限于图像的保存方式(分配或不分配),您可以使用 policy model .
简短的解释是,您将向图像传递一个策略对象,其中该策略描述了您是否需要释放图像、如何访问它等,基本上是与由图像引起的差异相关的任何内容如何保存图像数据(分配与指向)。然后您对图像的所有访问都将通过该策略。
例如,而不是写
delete image;
你会写:
policy.del(image);
policy.del
可以是 delete
的委托(delegate)或空操作,具体取决于策略的实际类型(即符合图像的内容需要)
关于c++ - 图像类层次结构的设计建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10397361/