Доступ к объекту из другого класса - Дизайн - PullRequest
0 голосов
/ 01 сентября 2010

У меня есть три класса, 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.

или . Вы рекомендуете какой-либо другой подход к дизайну моего класса?

Ответы [ 4 ]

1 голос
/ 01 сентября 2010

Я бы, конечно, рекомендовал другую реализацию, но давайте сначала проверим дизайн.

Я не совсем понимаю добавленную стоимость TImageProcessingEngine, она не приносит никакой функциональности.

Мой совет был бы довольно прост:

  • Image класс, для хранения значений
  • 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 следуют тому же принципу.

Обратите внимание, что мне никогда не требовался явный указатель и гарантированная правильность, которая вытекает из него.

1 голос
/ 01 сентября 2010

Почему вы хотите иметь отдельный процесс TProcessing, когда у него есть функции, которые просто обращаются к mpImageMatrix;

В ООП вам необходимо связать членов данныхи это операции ..

Итак, ИМО, удалите свой класс 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;
};
1 голос
/ 01 сентября 2010

Во-первых, на основании предоставленного вами кода в классе TImageProcessingEngine нет функций ReadImage () и WriteImage (), поэтому более поздний код, в котором вы используете такую ​​функциональность, имеет недостатки.

Что касается решения,Вы можете сделать функцию получения для указателя tImageMatrix следующим образом:

tImageMatrix* GetImageMatrix() { return mpImageMatrix; }

Затем просто передайте этот указатель (или указатель на весь экземпляр TImage) в функцию TProcessing, которую вы хотите вызвать.

0 голосов
/ 01 сентября 2010

Вы можете создать аксессор TImage класс:

byte * pixelAt(unsigned x, unsigned y);
...