我继承了一个管理RGB图像的类的项目,该类的主要成分是数据类型RGBPixel的可变大小数组(简化版本在下面给出)。它包含许多基本上是接口(interface)的方法-例如遍历所有像素并调用Operate类的某个方法的RGBPixel方法。

现在,我需要处理具有不同像素类型的图像(我们称它们为NewPixelNewImage)。接口(interface)类型的方法与RGBImage相同,但是并非所有方法都是像素级的接口(interface)(例如,在图像类型之间进行转换或从磁盘读取)。

我显然不想加倍我的代码。我觉得我需要将模板类和基类组合在一起的东西(RGBImageNewImage都将继承,但是我不知道如何进行此操作(我一直在努力学习,在网络上待了几天)。

class RGBImage {
public:
    RGBImage::RGBImage(int w, int h) {
        _width = w;
        _height = h;
        _pixels = new RGBPixel[w*h];
    }
    RGBImage::~RGBImage() { _pixels = NULL; }

    void RGBImage::Operate(int val) {
        for (int i = 0; i < _width*_height; i++)
            _pixels[i].Operate(val);
    }

    void RGBImage::RGBSpecific() {
        bla bla bla
    }


private:
    int       _width, _height;
    RGBPixel* _pixels;
};

最佳答案

您可以从提取所有与像素无关的东西开始,并创建一个抽象基类。

class AbstractImage {
public:
  AbstractImage(int w, int h) : _width(w), _height(h) { }
  virtual ~AbstractImage() = 0;
  virtual void Operate(int val) = 0;

protected:
    int _width, _height;
}

然后,您创建一个基础模板类,实现适用于各种像素的所有功能。
template<typename Pixel>
class TemplateImage : public AbstractImage {
public:
  TemplateImage (int w, int h) : AbstractImage(w, h), _pixels(w*h) { }
  ~TemplateImage () {};
  void Operate(int val) {
    for (int i = 0; i < _width*_height; i++)
      _pixels[i].Operate(val);
  }

protected:
    std::vector<Pixel> _pixels; //Changed raw pointer to vector to avoid memory management
}

最后,您声明一个名为Image的模板类
template<typename Pixel>
class Image;

并让它像这样。稍后将专门针对您的像素类型。
template<>
class Image<RGBPixel> : TemplateImage<RGBPixel> {
public:
  Image(int w, int h) : TemplateImage(w, h) { }

  void RGBSpecific() {
    bla bla bla
  }
}

template<>
class Image<NewPixel> : TemplateImage<NewPixel > {
public:
  Image(int w, int h) : TemplateImage(w, h) { }

  void NewPixelSpecific() {
    bla bla bla
  }
}

您将只能实例化Image<RGBPixel>Image<NewPixel>。他们有其特定的操作。您可以将AbstractImage用于适用于任何类型图像的函数。

10-06 00:05