ホーム < ゲームつくろー! < クラス構築編 < 改改・スマートポインタテンプレートクラス(スワップ(交換)サポート):サンプルプログラム


// こちらのスマートポインタは旧バージョンとなりました。最新バージョンはツール編にあります。


> 旧テキスト <


改改・スマートポインタテンプレートクラス(交換サポート):サンプルプログラム


 クラス構築編『改改・スマートポインタテンプレートクラス(交換サポート)』で紹介したスワップ付きのスマートポインタテンプレートクラスを公開致します。ここではクラスのメンバメソッドと演算子の使い方を簡単にまとめました。

 ソースは冗長になるのでダウンロード形式に致します。こちらからダウンロードして下さい。現在のバージョンはv2.02(2007. 3. 6更新)です(バージョンレポートはこちら)。


// 配列形式のサポートをやめました。deleteとdelete[]を保持しているポインタからどう判断したら良いかわかりません。知っている方は是非ご連絡ください!


○ 使用に関する注意

 スマートポインタをメンバとして保持するクラスは必ず仮想デストラクタを設けて下さい。仮想デストラクタが無い場合、クラスは単純に削除されてしまい、スマートポインタのデストラクタが呼ばれません。これはメモリリークにつながります。もしスマートポインタを使用してメモリリークが発生したら、この可能性を疑ってみて下さい。


○ メンバメソッド

公開メンバメソッド 説明 使い方 備考
sp( T* src=NULL, int add = 0 )
sp( const sp<T> &src )
sp( sp<T2> &src )
sp( const int nullval )
コンストラクタ sp<int> spInt( new int ); スマートポインタには必ずnewで確保したメモリを保持させるようにして下さい。newで確保したポインタを2つのスマートポインタに渡しては絶対にいけません(2重消去になるため)。
~sp( void ) デストラクタ - -
bool DownCast( sp<T2> &src ) ダウンキャスト sp<CParents> spC( new CChild );
sp<CChild> spMe;
spMe.DownCast( spC );
引数のスマートポインタが格納しているポインタを自分のポインタにダウンキャストできる場合はダウンキャストコピーを行ってtureを返します。ダウンキャストに失敗すた場合は何もせずにfalseを返します。
T* GetPtr() ポインタ取得 sp<CObject> spObj( new CObject );
CObject *p = spObj.GetPtr();
保持しているポインタの貸し付けを行います。このポインタ先の実体を操作すると共有するすべてのスマートポインタが影響を受けます。取得したポインタを消してはいけません。
T** GetPtrPtr() ダブルポインタ取得 sp<CObject> spObj( new CObject );
CObject **p = spObj.GetPtrPtr();
保持しているオブジェクトへのダブルポインタを取得します。
unsigned int* GetRefPtr() 参照カウンタへのポインタを取得 unsigned int = *spObj.GetRefPtr(); 参照カウンタへのポインタを取得します。通常は左記のように間接参照演算子によってその値を直接得ます。取得したポインタを通して値を変更してはいけません。
void SetPtr( T* src=NULL, unsigned int add = 0) オブジェクトポインタを設定 CObject *p = new CObject;
sp<CObject> spObj;
spObj.SetPtr( p );
newで確保したオブジェクトポインタを格納します。代入と同じ役目をしますので、格納前のポインタに対する参照カウンタが1つ減らされ、新しいポインタの参照カウンタを1とします。
void SwapPtr( sp<T> &src ) ポインタを交換 sp<int> I_Src( new int(0) );
sp<int> I_Dest( new int(1) );
sp<int> I_Dest2 = I_Dest;

I_Src.SwapPtr( I_Dest );
保持しているポインタを丸ごと交換します。これにより実質スマートポインタが指す実体を交換した事になります。


演算子 説明 使い方 備考
bool operator !=(T *val) 比較演算子 sp<int> spInt_Src( new int );
sp<int> spInt_Dest( new int );

if( spInt_Src != spInt_Dest )
  return false;
2つのスマートポインタを比較します。同じ実体を指していなければtrueを、同じ実体を指していればfalseを返します。
T& operator *( void ) 間接参照演算子 sp<CObject> spObj( new CObject );
*spObj.Func( );
保持しているポインタの先にある実体アドレスを返します。使用法はポインタの間接参照演算子と同じです。NULLを保持している場合はメモリ保護違反になりますので注意してください。
sp<T>& operator =(const int nullval )
sp<T>& operator =( sp<T> &src )
sp<T>& operator =( sp<T2> &src )
代入演算子 sp<CObject> spSrc( new CObject );
sp<CObject> spDest;

spSrc = spDest;
代入すると自身がそれまで持っていたポインタを放棄し、新しいポインタを保持します。参照カウンタは正しく動作します。NULLを代入すると空スマートポインタとなります。
bool operator ==( T* val ) 比較演算子 sp<int> spInt_Src( new int );
sp<int> spInt_Dest( new int );

if( spInt_Src == spInt_Dest )
  return false;
2つのスマートポインタを比較します。こ同じ実体を指していればtrueを、違う実体を指していればfalseを返します。
T* operator ->( void ) メンバ選択演算子 sp<CObject> spObj( new CObject );
spObj->Func( );
保持しているオブジェクトへのポインタを取得します。通常のポインタに対するメンバ選択演算子と同じです。



○ バージョンレポート

v2.01 -> v2.02 (2007. 3. 6)
vector等のコンテナに格納できないバグを修正(コピーコンストラクタのミスによる)

v2.00 -> v2.01 (2007. 3. 1)
 同形コピーでコピーコンストラクタが呼ばれない不具合を修正
 明示的アップキャスト及び暗黙的アップキャストでダブルポインタが代入されない不具合を修正

v1.00 -> v2.00 (2007. 2. 11)
SwapPtrメソッドによるポインタ入れ替えのサポート

v1.00
基本機能実装
・登録されたオブジェクトポインタの使用者がいなくなったら自動的にdelete
・通常のポインタ操作演算子「*」「->」「[ ]」が使える。
・異なるオブジェクトポインタが登録された状態でアップキャストができる
・DownCastメソッドによる安全なダウンキャストサポート