我正在製作一組類以表示圖像。這個類的其中一個應用就是通過一組平鋪的圖像繪製圖片。抽象圖像類看起來是這樣的:如何應對返回指針的生命週期?
class Image
{
public:
virtual Pixel* findPixel(Point p) =0;
virtual bool isDrawable(Point p) =0;
virtual bool contains(Point p) =0;
};
我預見的問題是,如果我是這樣的一類:
class TiledImage : public Image
{
std::vector<Image*> tiles;
public:
Pixel* findPixel(Point p)
{
// find the tile that contains the point.
// ask it for the pixel that contains the point.
// return the pixel.
}
// etc....
};
,旨在創建,保存和刪除第(磚)根據需要可以存儲非常大的圖像,則用戶可能會存儲指向可能最終不再存在的Pixel對象的指針。
一種選擇是要求用戶檢查像素背的時候都在做,比如:
Pixel* p = image.findPixel(aPoint);
// do stuff
image.returnPixel(p); // p is not guaranteed to be valid after this point.
p->doSomething(); // this is not guaranteed to work.
我真的不喜歡這一點,因爲如果用戶不返回該像素,則它真的可能會混淆平鋪圖像的操作 - 忘記返回像素會導致它完全鎖定,因爲它無法刪除不再需要的平鋪。它們將被鎖定以保證指向像素的指針保持有效。鎖定的原因可能對用戶難以發現。
此外,這種擔心是一種專業化。在典型情況下圖像消失之前,您不會指望像素消失。
有沒有更好的方法來處理這種情況?智能指針?不要以某種方式返回參考?使TiledImage從Image繼承是否沒有意義?我當然希望能夠將TiledImage作爲圖片傳入,因爲我期望圖片非常大。
謝謝。
我擔心交給Pixel引用,因爲如果用戶不小心寫入Pixel p = image.findPixel(...)而不是Pixel&p = image.findPixel(...),他們將不會更改它們的圖像改變像素值。 – user487100
@ user487100別擔心,所有返回引用的函數都有'問題',但我從來沒有見過任何人對此感到困惑。 – Pubby