从不同的类访问对象 - 设计

时间:2010-09-01 07:52:00

标签: c++ class image-processing class-design c++builder

我有三个课程,TImageProcessingEngineTImageTProcessing

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.

您是否建议我的班级设计采用其他方法?

4 个答案:

答案 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类(接口),以应用操作
  • EncoderDecoder类(接口),用于读写不同的格式

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;
};

EncoderDecoder遵循相同的原则。

请注意我从不需要一个明确的指针,以及由此产生的保证正确性。

答案 3 :(得分:0)

您可以创建一个访问者TImage类:

byte * pixelAt(unsigned x, unsigned y);