Palm Programmer's Laboratory
【C++】 HandleLocker テンプレート
[開発情報]
概要
「 【C++】 リソースのための汎用クラステンプレート 」で紹介したものと同じ発想で、MemHandle をロックするためのクラステンプレートを提示します。
説明
テンプレート本体のソースは以下のとおりです。考え方は以前とまったく同じなので、特に問題ないかと思います。
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 を渡すことでオブジェクトのライフタイム中だけハンドルをロックし続けます。使い方はリソーステンプレートとほぼ同じです。
基本的にコールスタック上で使用する前提なので、operator new と operator delete は使用禁止にしてあります。また、コピーコンストラクタ・代入演算子も private 宣言することで禁止してあります。
参考情報
リソースの取得処理をクラスでラップする基本的な考え方については、「 【C++】文字列リソースのための簡単なラッパークラス 」 を参照してください。
注意事項
上記のクラステンプレートは CodeWarrior 9.0J にて動作確認を行っています。エラー処理についてはそれほど真剣に検討していないので注意してください。