gpt4 book ai didi

C++ 从基类引用子类指针属性

转载 作者:太空宇宙 更新时间:2023-11-04 11:39:57 25 4
gpt4 key购买 nike

我继承了一个项目,其中有一个管理 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适用于任何类型图像的函数。

关于C++ 从基类引用子类指针属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21757528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com