Я бы, конечно, рекомендовал другую реализацию, но давайте сначала проверим дизайн.
Я не совсем понимаю добавленную стоимость 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
следуют тому же принципу.
Обратите внимание, что мне никогда не требовался явный указатель и гарантированная правильность, которая вытекает из него.