C++ 从不同的类设计访问对象
我有三个类,C++ 从不同的类设计访问对象,c++,class,image-processing,class-design,c++builder,C++,Class,Image Processing,Class Design,C++builder,我有三个类,TImageProcessingEngine,TImage和TProcessing TImageProcessingEngine是我用来向世界公开我所有方法的工具 TImage是我计划使用的通用图像读取和图像写入功能 t处理包含将执行成像操作的方法 class TImageProcessingEngine { public: TImage* mpImageProcessingEngine; }; class TImage { public:
TImageProcessingEngine
,TImage
和TProcessing
TImageProcessingEngine
是我用来向世界公开我所有方法的工具
TImage
是我计划使用的通用图像读取和图像写入功能
t处理
包含将执行成像操作的方法
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();
};
我的问题是如何访问类TProcessing
中的对象mpImageMatrix
?,以便调用应用程序可以使用以下内容
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类中没有ReadImage()和WriteImage()函数,因此使用此类功能的后续代码有缺陷 对于解决方案,您可以为tImageMatrix指针创建一个getter函数,如下所示:
tImageMatrix* GetImageMatrix() { return mpImageMatrix; }
然后只需将该指针(或指向整个TImage实例的指针)传递给您要调用的TProcessing函数。首先,根据您提供的代码,TImageProcessingEngine类中没有ReadImage()&WriteImage()函数,因此使用该功能的后续代码存在缺陷 对于解决方案,您可以为tImageMatrix指针创建一个getter函数,如下所示:
tImageMatrix* GetImageMatrix() { return mpImageMatrix; }
然后只需将该指针(或指向整个TImage实例的指针)传递给要调用的TProcessing函数。您可以创建一个访问器
TImage
类:
byte * pixelAt(unsigned x, unsigned y);
您可以创建访问器
TImage
类:
byte * pixelAt(unsigned x, unsigned y);
为什么您希望有一个单独的
t处理
进程,而它专门具有访问mpImageMatrix的函数代码>
在OOP中,必须绑定数据成员及其操作
因此,在我看来,删除您的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;
};
为什么您希望有一个单独的t处理
进程,而它专门具有访问mpImageMatrix的函数代码>
在OOP中,必须绑定数据成员及其操作
因此,在我看来,删除您的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;
};
我当然会推荐一个不同的实现,但是让我们先检查一下设计
我真的不理解TImageProcessingEngine
的附加值,它没有带来任何功能
我的建议其实很简单:
Image
class,用于保存值
处理
类(接口),以应用操作
编码器
和解码器
类(接口),用于读写不同格式
只有当您可以从处理中获得效率时,处理类才有权访问内部图像(这很可能),在这种情况下,您可以简单地将处理
交给朋友,并让它为其派生的类解包值
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;
};
类图像
{
公众:
图像();
无效接受(处理和处理);
void Encode(编码器&e)const;//图像未通过编码修改
void Decode(Decoder&d);//这实际上重置了图像内容
私人:
好友类处理;
大小和重量;
尺寸/宽度;
std::vector mPixels;//像素的2D数组
};
类处理
{
公众:
无效应用(图像和图像)
{
这->applyImpl(image.mHeight、image.mWidth、image.mPixels);
}
私人:
虚拟空应用示例(大小h、大小w、标准::向量和像素)=0;
};
编码器
和解码器
遵循相同的原则
请注意,我从来都不需要显式指针,以及由此产生的有保证的正确性。我当然会推荐不同的实现,但让我们先检查一下设计
我真的不理解TImageProcessingEngine
的附加值,它没有带来任何功能
我的建议其实很简单:
Image
class,用于保存值
处理
类(接口),以应用操作
编码器
和解码器
类(接口),用于读写不同格式
只有当您可以从处理中获得效率时,处理类才有权访问内部图像(这很可能),在这种情况下,您可以简单地将处理
交给朋友,并让它为其派生的类解包值
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;
};
类图像
{
公众:
图像();
无效接受(处理和处理);
void Encode(编码器&e)const;//图像未通过编码修改
void Decode(Decoder&d);//这实际上重置了图像内容
私人:
好友类处理;
大小和重量;
尺寸/宽度;
std::vector mPixels;//像素的2D数组
};
类处理
{
公众:
无效应用(图像和图像)
{
这->applyImpl(image.mHeight、image.mWidth、image.mPixels);
}
私人:
虚拟空应用示例(大小h、大小w、标准::向量和像素)=0;
};
编码器
和解码器
遵循相同的原则
请注意,我从来都不需要显式指针,以及由此产生的保证正确性。我已经声明了TImage*mpImageProcessingEngine;在TImageProcessingEngine类中;因此,我可以调用ReadImage()和WriteImage()方法;在TImageProcessingEngine类中;所以我可以调用ReadImage()&WriteImage()方法。您不认为,这会耗费大量时间,因为您正在尝试访问单个像素?如果此函数是内联的,则不会产生任何开销。您不认为,这会耗费大量时间,因为您是tr吗