共享父类成员的子类

时间:2012-12-24 02:13:57

标签: c++

我有一个尴尬的问题。我认为这是不可能的,但我需要确定。这是一个奇怪的请求,但我需要我的子类来共享父类的SAME像素向量。

基本上,我想创建一个Image类的实例。 Image类将为Bitmap和Png Class保存像素,这样如果我需要从Bitmap转换为PNG,反之亦然,它们使用相同的向量,而不是创建Bitmap和PNG类。

class Image
{
    private:
        std::vector<RGB> Pixels;
};



class Bitmap : Image
{
    public:
        Bitmap() : Image() {};
};


class Png : Image
{
    public:
        Png() : Image() {};
};

这样当我这样做时:

int main()
{
    Image Img();

    Img.GetBitmapPixels();  //This
    Img.GetPngPixels();     //And this, return the same Pixels Vector.

    Bitmap Foo = Img.ToPng();
    Png Moo = Img.ToBitmap();
    //Such that both Foo and Moo have the exact same underlying Pixels Vector.
}

目前我的课程如下:

class Bitmap
{
    private:
        std::vector<RGB> Pixels;

    public:
        Bitmap();
        std::vector<RGB> GetPixels() {return Pixels;}
        void SetPixels(std::vector<RGB> Pixels) {this->Pixels = Pixels;}
};

class Png
{
    private:
        std::vector<RGB> Pixels;

    public:
        Png();
        std::vector<RGB> GetPixels() {return Pixels;}
        void SetPixels(std::vector<RGB> Pixels) {this->Pixels = Pixels;}
};

要从一个转换为另一个,我必须这样做:

int main()
{
    Bitmap Bmp();
    Png PNG();

    PNG.SetPixels(BMP.GetPixels);   //BMP has to COPY PNG's Pixels and vice-versa..
}

这是一个愚蠢的问题。我只是不想复制像素。我只是希望能够在没有任何复制的情况下在两个类之间进行转换,因为这两个类都包含一个std :: vector Pixels成员,并且数据的对齐方式相同。

我想我正在努力做到:PNG.SaveAsBitmap(...);或BMP.SaveAsPNG(...);没有创建另一个的新实例。

如何避免复制/创建并创建我要转换为的其他类的新实例?我可以拥有从彼此继承的课程吗?

2 个答案:

答案 0 :(得分:1)

由于它们共享一个父项作为一个公共因子,你可以选择使用指针(这被认为是一个浅层副本),但这通常不是明智的,因为深层副本通常更好。也许您可以创建两个函数,一个用于创建浅拷贝,另一个用于深拷贝。由于Bitmap和Png是独立的实体(它们是兄弟姐妹)。也许您应该允许BMP成为png的父级?

您也可以选择完全解耦编码以节省目的,并且只处理原始图像数据。

答案 1 :(得分:1)

我可能会过度简化这一点。你是如何加载数据的?如果每种图像类型都相同,那么您可以在图像类中加载并仅重载翻译功能。我不是图像数据的专家,但你可以做类似的事情:

   public Image
    {
       private Pixels data;
       public void GetPixels();
       public virtual Pixels ToFormat(FormatEnum format);
    }

    public Bitmap:Image
    {
        public override Pixels ToFormat(FormatEnum format)
        {
            switch(format){  
                case FormatEnum.Bitmap:return data;break;
                case FormatEnum.Png:return doSomethingElse();break;
            }
        }
    } 

   int main()
   {
      Image Img();

      Img.GetPixels();

       Bitmap Foo = Img.ToFormat(Format.BitMap);
       Png Moo = Img.ToFormat(Format.Png);

   }