BrewSDK 開発(2)
スマートオブジェクトと、ストリーム関係の一部を実装しました。
id:melpon:19990101
ストリームクラスは、参照オブジェクトクラス風になっています。
スマートオブジェクトクラスは、参照オブジェクトクラス群の基底クラスです。
参照オブジェクトクラスにすると、次のようなプログラムを組むことが出来るようになります。
BrewByteArrayInputStream bais = BrewByteArrayInputStream::Create( inbuf , insize ); BrewUnzipStream us = BrewUnzipStream::Create( bais ); BrewDataInputStream dis = BrewDataInputStream::Create( us ); int num = dis.ReadInt(); for( int i = 0 ; i < n ; i++ ){ int size = dis.ReadInt(); dis.Read( outbuf[ n ] , size ); } dis = null; // ストリームを閉じる(デストラクタで解放されるので、別に放置したままでも良い)
Brew〜 というクラスは、ポインタを使っていないというところと、ドット演算子でアクセスしていることに注目です。
また、BrewUnzipStream::Create() の引数は、BrewInputStream という、入力ストリーム基底クラスをセットすることが出来るので、これを継承したクラスならどのストリームでも unzip することが可能です。
言ってみれば、スマートポインタの、ドット演算子でのアクセスを行うバージョンのようなものですが、少し違う部分があります。
それは、this ポインタもスマートオブジェクトになっているということです。
スマートポインタを使って内部で this を渡した場合、それは管理されていない状態のポインタとなるので危険です。
しかし、スマートオブジェクトというクラスが this ポインタの代替となるメンバを持っているので、これを渡してやることにより、安全な this の受け渡しが可能になります。
とりあえずファイルストリーム実装しないとなぁ……(;´Д`)