画像を表す一連のクラスを作成しています。このクラスのアプリケーションの 1 つは、一連のタイル化された画像の上に絵を描くことです。抽象イメージ クラスは次のようになります。
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 オブジェクトへのポインターをユーザーが保存する可能性があります。
1 つのオプションは、次のように、完了したらピクセルをチェックインするようにユーザーに要求することです。
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 を Image として渡すことができるようにしたいと考えています。
ありがとう。