その12 リンクリスト方式スマートポインタ(v1.01)
リンクリスト方式を採用したスマートポインタです。この方式のスマートポインタについて詳しくはクラス構築編の「リンクリスト方式なスマートポインタ」の記事を参考にして下さい。
名前 | バージョン | 公開日 | |
リンクリスト方式スマートポインタ | 1.01 | 2010. 11.17 |
v1.01ではコピーコンストラクタが無いためにSTL等のコンテナに保持出来ないバグを修正しました。
○ 定義
名前空間 | ヘッダー |
Dix | sp.h |
○ スマートポインタメンバメソッド
公開メンバメソッド | 説明 | 使い方 | 備考 |
sp(T *ptr = 0) sp(const sp<T> &src) template<class T2> sp(const sp<T2> &src) |
コンストラクタ | sp<int> spInt( new int ); | スマートポインタには必ずnewで確保したメモリを保持させるようにして下さい。newで確保したポインタを2つのスマートポインタに渡しては絶対にいけません(2重消去になるため)。 |
~sp() | デストラクタ | - | - |
template<class T2> sp<T> &downcast(sp<T2> &src) |
ダウンキャスト | sp<CParents> spC( new CChild ); sp<CChild> spMe; spMe.downCast( spC ); |
引数のスマートポインタが格納しているポインタを自分のポインタにダウンキャストできる場合はダウンキャストコピーを行います。キャストに成功したか否かは戻り値(自分自身)の保持ポインタがNULLかどうかでチェックできます。 |
const T* getPtr() const T* getPtr() |
ポインタ取得 | sp<CObject> spObj( new CObject ); CObject *p = spObj.getPtr(); |
保持しているポインタの貸し付けを行います。このポインタ先の実体を操作すると共有するすべてのスマートポインタが影響を受けます。取得したポインタを消してはいけません。 |
演算子 | 説明 | 使い方 | 備考 |
bool operator !=(const sp<T> &r) bool operator ==(const sp<T> &r) |
比較演算子 | sp<int> spInt_Src( new int ); sp<int> spInt_Dest( new int ); if( spInt_Src != spInt_Dest ) return false; |
2つのスマートポインタを比較します。同じ実体を指していなければtrueを、同じ実体を指していればfalseを返します。 |
const T &operator *() const T &operator *() |
間接参照演算子 | sp<CObject> spObj( new CObject ); (*spObj).Func( ); |
保持しているポインタの先にある実体参照を返します。使用法はポインタの間接参照演算子と同じです。NULLを保持している場合はメモリ保護違反になりますので注意してください。 |
sp<T> &operator =(sp<T> &src) template<class T2> sp<T> &operator =(sp<T2> &src) sp<T> &operator =(int) |
代入演算子 | sp<CObject> spSrc( new CObject ); sp<CObject> spDest; spSrc = spDest; |
代入すると自身がそれまで持っていたポインタを放棄し、新しいポインタを保持します。引数にintを取るメソッドはNULL代入用です。引数の値に関係なく内部では保持ポインタにNULLが代入され、リンクリストから外された空スマートポインタとなります。 |
const T *operator ->() const T *operator ->() |
メンバ選択演算子 | sp<CObject> spObj( new CObject ); spObj->Func( ); |
保持しているオブジェクトへのポインタを取得します。通常のポインタに対するメンバ選択演算子と同じです。 |
operator int() | NULL代入 | sp<CObject> spObj(0); | NULL代入用の演算子です。 |
○ バージョンレポート
v1.01 (2010. 11. 17)
コピーコンストラクタが無いためにSTLのコンテナに保持できないバグを修正
v1.00 (2010. 10. 19)
初出。最低限のメソッドを実装。