2014-02-19 32 views
0

我一直在寫一個簡單的C++類來繪製PPM圖像。我得到了翻轉或旋轉圖像的功能,或者將像素從一個地方複製到另一個地方。對我而言,發生這種情況的一種方式是從本身內部「替換」實例,因爲旋轉給我帶來的麻煩比我想象的要多。我的圖像類存儲一個指向堆中像素數組的指針,並且具有寬度和高度的成員變量。我可以通過創建一個新的圖像實例來旋轉圖像,其中寬度和高度被交換,並且新實例的像素數組使用來自前一圖像數組的數據填充(當然應用右旋數學)。然而,不是返回新的實例,我希望以前的實例將其「this」指針重新分配給新實例。這樣,我可以使用像這樣的函數:image.rotate(90),而不是image = image.rotate(90);我知道這是一個小小的不便,但與所有其他功能的調用方式不一致。取代自己的C++類?

這裏是我如何設想旋轉功能工作的僞代碼:

void image::rotate(int angle){ // 0, 90, 180, or 270 degrees only 
    // if image is rotated 90 or 270 degrees, swap width and height 
    if(angle == 90 || angle == 270){ 
     image * new_image = new image(height, width); 
    }else{ 
     image * new_image = new image(width, height); 
    } 

    for(int y = 0; y < height; y++){ 
     for(int x = 0; x < width; x++){ 
      // do rotation code here to copy pixel data to new image 
     } 
    } 

    // assign the new image to this instance 
    image * old_image = this; 
    this = new_image;    // LVALUE REQUIRED AS LEFT OPERAND OF ASSIGNMENT 
    delete old_image; 

} 

然而,當我嘗試,我得到編譯錯誤說,這種= new_image線是壞的。我試圖找到更好的方法來執行不需要替換實例的旋轉,例如創建一個新的像素數組並重定向指針,但由於某些原因,交換寬度和高度會干擾保存功能我將數據寫入文件,所以我仍然有工作要做。這個問題讓我想到了一個實例創建一個新實例並取代它自身的一般問題。

+0

我認爲這種代碼在1982年的CFront中是可能的......然後大家意識到這是一個可怕的想法。 –

+1

爲圖像定義賦值運算符並使用'* this = * new_image' – AndyG

回答

1

您不能分配到this,因爲它是恆定的。因爲它是一種特殊的指針,所以你不能聲明它。

this指針類型爲X的成員函數的指針的類型爲X* const。如果用const限定符聲明成員函數,則該類成員函數的指針的類型X的類型爲const X* const

你可以指定*this,所以指向this所指向的對象指針。

這似乎是可能的解決方案,您的問題可能是

*this = *new_image; 

當然,這是假設operator=image定義。

+0

感謝您的澄清。我剛剛完成了=運算符函數,因此我按照您的建議做了編譯。當我試圖在翻轉圖像後保存圖像時,程序仍然崩潰,得到其中一個glibc檢測到我仍然不知道如何解釋的錯誤。 – user137

+0

請顯示現在是問題的代碼,我們將嘗試找到原因,然而在另一個問題中執行此操作 – 4pie0