我有三个类,TImageProcessingEngine
,TImage
和TProcessing
TImageProcessingEngine
是我用来向世界公开我所有方法的一种。
我计划使用TImage
使用通用图像读取和图像写入功能。TProcessing
包含将执行成像操作的方法。
class TImageProcessingEngine
{
public:
TImage* mpImageProcessingEngine;
};
class TImage
{
public:
int ReadImage();
int WriteImage();
private:
//a two dimensional array holding the pixel values
tImageMatrix* mpImageMatrix;
};
class TProcessing
{
public:
int ConvertToBinary();
int ConvertToGrayScale();
};
我的问题是如何访问类
mpImageMatrix
中的对象TProcessing
?这样我的调用应用程序可以使用以下内容TImageProcessingEngine* vEngine = new TImageProcessingEngine;
//Converts an input gray scsale image to binary image
vEngine->ReadImage().ConvertToBinary();
//Write the converted image to disk
vEngine->WriteImage();
delete vEngine;
vEngine = NULL;
//During this whole processing internally,
//the image is read in to `mpImageMatrix`
//and will also be holding the binarised image data,
//till writing the image to disk.
还是您对我的课堂设计推荐其他方法?
最佳答案
我当然会推荐其他实现,但是让我们先检查一下设计。
我不太了解TImageProcessingEngine
的附加值,它没有带来任何功能。
我的建议实际上非常简单:Image
类,用于保存值Processing
类(接口),以应用操作Encoder
和Decoder
类(接口),以读写不同的格式
仅当您可以从中获得效率时,Processing
类才可以访问内部图像(这很可能),这是有意义的,在这种情况下,您可以简单地与Processing
成为朋友并为其解包其值派生的
class Image
{
public:
Image();
void Accept(Processing& p);
void Encode(Encoder& e) const; // Image is not modified by encoding
void Decode(Decoder& d); // This actually resets the image content
private:
friend class Processing;
size_t mHeight;
size_t mWidth;
std::vector<Pixel> mPixels; // 2D array of Pixels
};
class Processing
{
public:
void apply(Image& image)
{
this->applyImpl(image.mHeight, image.mWidth, image.mPixels);
}
private:
virtual void applyImpl(size_t h, size_t w, std::vector<Pixel>& pixels) = 0;
};
Encoder
和Decoder
遵循相同的原理。请注意,我永远不需要显式指针,以及由此产生的保证正确性。