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吗