我有三个课程,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.
或您是否建议我的班级设计采用其他方法?
答案 0 :(得分:1)
首先,根据您提供的代码,没有ReadImage()& WriteImage()函数在TImageProcessingEngine类中,因此使用此类功能的后续代码存在缺陷。
至于解决方案,您可以像这样为tImageMatrix指针创建一个getter函数:
tImageMatrix* GetImageMatrix() { return mpImageMatrix; }
然后将该指针(或指向整个TImage实例的指针)传递给您要调用的TProcessing函数。
答案 1 :(得分:1)
为什么你想要一个单独的TProcessing
进程,当它专门具有访问mpImageMatrix;
在OOP中,您必须绑定 数据成员及其操作 ..
因此,IMO,删除您的TProcessing
课程并在TImage
中同时拥有这两项功能..
您的TImage
将会是,
class TImage
{
public:
int ReadImage();
int WriteImage();
int ConvertToBinary();
int ConvertToGrayScale();
private:
//a two dimensional array holding the pixel values
tImageMatrix* mpImageMatrix;
};
答案 2 :(得分:1)
我当然会推荐一种不同的实现,但我们先来检查设计。
我真的不明白TImageProcessingEngine
的附加值,它没有带来任何功能。
我的建议其实很简单:
Image
class,用于保存值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
遵循相同的原则。
请注意我从不需要一个明确的指针,以及由此产生的保证正确性。
答案 3 :(得分:0)
您可以创建一个访问者TImage
类:
byte * pixelAt(unsigned x, unsigned y);