代码之家  ›  专栏  ›  技术社区  ›  Raj

从其他类访问对象-设计

  •  0
  • Raj  · 技术社区  · 14 年前

    我有三节课, 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 课堂上 加工过程 ? 以便我的呼叫应用程序可以使用以下

    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 回复  |  直到 14 年前
        1
  •  1
  •   Matthieu M.    14 年前

    我当然会推荐一个不同的实现,但是让我们先检查一下设计。

    我不太明白 TImageProcessingEngine 它没有任何功能。

    我的建议其实很简单:

    • Image 类,以保存值
    • Processing 类(接口),用于应用操作
    • Encoder Decoder 类(接口),以不同格式读写

    这对 处理 类以访问内部图像,前提是您可以从中获得效率(这很可能),在这种情况下,您只需 处理 并让它解包其派生的值

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

    编码器 译码器 遵循同样的原则。

    注意我从来就不需要一个明确的指针,以及它所保证的正确性。

        2
  •  1
  •   Strom Ali Afshar    14 年前

    首先,根据您提供的代码,timageProcessingEngine类中没有readImage()&writeImage()函数,因此使用此类功能的后面代码是有缺陷的。

    对于解决方案,可以为timageMatrix指针生成getter函数,如下所示:

    tImageMatrix* GetImageMatrix() { return mpImageMatrix; }
    

    然后只需将该指针(或指向整个timage实例的指针)传递给要调用的tprocessing函数。

        3
  •  1
  •   liaK    14 年前

    为什么你想要一个单独的 TProcessing 进程,当它特别具有只访问的函数时 mpImageMatrix;

    在OOP中,你必须 绑定 数据成员及其操作

    所以,我想,把你的 加工过程 类中的两个函数 TImage

    你的 计时器 会像,

    class TImage
    {
    public:
        int ReadImage();
        int WriteImage();
        int ConvertToBinary();
        int ConvertToGrayScale();
    
    private:
            //a two dimensional array holding the pixel values
        tImageMatrix*  mpImageMatrix;
    };
    
        4
  •  0
  •   tibur    14 年前

    您可以创建一个访问器 TImage 班级:

    byte * pixelAt(unsigned x, unsigned y);