我一直在寫一個簡單的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線是壞的。我試圖找到更好的方法來執行不需要替換實例的旋轉,例如創建一個新的像素數組並重定向指針,但由於某些原因,交換寬度和高度會干擾保存功能我將數據寫入文件,所以我仍然有工作要做。這個問題讓我想到了一個實例創建一個新實例並取代它自身的一般問題。
我認爲這種代碼在1982年的CFront中是可能的......然後大家意識到這是一個可怕的想法。 –
爲圖像定義賦值運算符並使用'* this = * new_image' – AndyG