トップ 一覧 検索 ヘルプ RSS ログイン

【C++】 HandleLocker テンプレートの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
{{category 開発情報}}
{{category 陰郎の書いた記事,nolink}}

!!概要
 「 [[【C++】 リソースのための汎用クラステンプレート]] 」で紹介したものと同じ発想で、MemHandle をロックするためのクラステンプレートを提示します。

 
!!説明
 テンプレート本体のソースは以下のとおりです。考え方は[[以前|【C++】 リソースのための汎用クラステンプレート]]とまったく同じなので、特に問題ないかと思います。

 template<typename T>
 class HandleLocker {
 public:
     typedef typename T DataType;
 
 public:
     HandleLocker( MemHandle handle ) : m_handle( handle ),
                                        m_pData( DataType( ) ) {
         m_pData = static_cast<DataType>( ::MemHandleLock( m_handle ) );
     };
 
     ~HandleLocker( ) {
         ::MemHandleUnlock( m_handle );
     };
 
 private:
     HandleLocker( const HandleLocker& rhs );
     HandleLocker& operator=( const HandleLocker& rhs );
 
 private:
     void* operator new( UInt32 n ) { return ::MemPtrNew( n ); };
     void operator delete( void* p ) { ::MemPtrFree( p ); };
 
 public:
     inline operator DataType( ) const {
         return m_pData;
     };
 
 private:
     MemHandle   m_handle;
     DataType    m_pData;
 
 };


 
 テンプレートのパラメータとしてデータ型を指定し、コンストラクタに MemHandle を渡すことでオブジェクトのライフタイム中だけハンドルをロックし続けます。使い方は[[リソーステンプレート|【C++】 リソースのための汎用クラステンプレート]]とほぼ同じです。

 基本的にコールスタック上で使用する前提なので、operator new と operator delete は使用禁止にしてあります。また、コピーコンストラクタ・代入演算子も private 宣言することで禁止してあります。

 

!!参考情報
 リソースの取得処理をクラスでラップする基本的な考え方については、「 [[【C++】文字列リソースのための簡単なラッパークラス]] 」 を参照してください。

 
!!注意事項
 上記のクラステンプレートは CodeWarrior 9.0J にて動作確認を行っています。エラー処理についてはそれほど真剣に検討していないので注意してください。

 
!!コメント
{{comment}}