2012-12-24 91 views
1

我有一個尷尬的問題。我認爲這是不可能的,但我需要確定。這是一個奇怪的請求,但我需要我的子類從父類共享SAME像素矢量。分享父類成員的子類

基本上,我想創建一個Image類的實例。該Image類將保存位圖和Png類的像素,以便如果我需要從位圖轉換爲PNG,反之亦然,它們使用相同的矢量,而不是創建位圖和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像素成員,並且數據的排列方式相同。

我想我試圖做到:PNG.SaveAsBitmap(...);或BMP.SaveAsPNG(...);而不創建另一個的新實例。

我該如何避免複製/創建並創建另一個類轉換爲新的實例?我可以擁有從彼此繼承的類嗎?

+0

你爲什麼要將圖像類分成兩個獨立的類?爲什麼不把像素存儲爲原始位圖,然後當你需要加載/保存時,會有不同的方法來加載/保存PNG,JPG,BMP等。 –

+0

那麼,因爲它們相當大,並已正常工作。我不想打破它併合並它們。它們也有相同名稱的成員完成不同的事情。我不確定你的意思是將像素存儲爲原始位圖。它們是兩個不同的類:S原始像素存儲在該向量中。 – Brandon

+1

我在兩種不同類型的圖像類中看不到這一點。在兩個類中都有一個'RGB'數組,爲什麼要將通用性分爲兩個不同的類。加載圖像後,可以將其存儲爲RAW像素數據(這是我的意思是位圖)的通用格式。 我會做的是:有一個'圖像'類代表一個通用圖像。有一個ImageLoader和ImagerSaver類,用於加載和保存圖像,具體取決於您希望加載/保存的文件格式。 –

回答

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); 

    } 
+0

噢,我加載LibPNG和其他我寫的位圖類來做到這一點。它們都以相同的順序存儲像素,對齊等。因此,我可以將像素從一個像素複製到另一個像素,然後保存並運行。 – Brandon

1

由於它們共享一個父項作爲公共因子,因此可以選擇使用指針(這被認爲是淺拷貝),但這通常不明智,深度拷貝通常更好。也許你可以創建兩個函數來創建一個淺拷貝和一個用於深拷貝的函數。由於位圖和Png是獨立的實體(它們是兄弟姐妹)。也許你應該讓BMP成爲png的父母?

您也可以選擇將編碼完全解耦以保存目的,並只處理原始圖像數據。