我正在制作一组类来表示图像。此类的一个应用是在一组平铺图像上绘制图片。抽象图像类看起来像这样:
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 作为图像传递。
谢谢。