- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
{{category 開発情報}}
{{category 陰郎の書いた記事,nolink}}
!!概要
「 [[【C++】文字列リソースのための簡単なラッパークラス]] 」で紹介したリソース取得処理をラップするクラスを発展させた汎用的なクラステンプレートについて説明します。
!!説明
いきなりですがテンプレート本体のソースを提示します。
template<DmResType resType, typename T>
class Resource {
public:
typedef typename T ResourceType;
public:
Resource( UInt16 resID ) : m_handle( MemHandle( ) ),
m_pResource( ResourceType( ) ) {
m_handle = ::DmGetResource( resType, resID );
if( !!m_handle )
m_pResource = static_cast<ResourceType>( ::MemHandleLock( m_handle ) );
};
~Resource( ) {
::MemHandleUnlock( m_handle );
::DmReleaseResource( m_handle );
};
private:
// intentionally no implementation...
Resource( const Resource& rhs );
Resource& operator=( const Resource& rhs );
private:
void* operator new( UInt32 n ) { return ::MemPtrNew( n ); };
void operator delete( void* p ) { ::MemPtrFree( p ); };
public:
inline operator ResourceType( ) const {
return m_pResource;
};
private:
MemHandle m_handle;
ResourceType m_pResource;
};
テンプレートのパラメータとしてリソースの種類とデータ型を指定します。このクラステンプレートは未定義の型 T を ResourceType という名前で typedef しています。T 型で特殊化した Resource テンプレートは T へのキャスト演算子をオーバーロードします。リソースの取得と開放はコンストラクタ・デストラクタで行います。
以下のような感じで使用します。
Resource<'tSTR', const char*> string( YOUR_STRING_RESOURCE_ID );
const char* p = string;
typedef するならば以下のような感じになるでしょう。
typedef Resource<'tSTR', const char*> StringResource;
StringResource string( YOUR_STRING_RESOURCE_ID );
const char* p = string;
基本的にコールスタック上で使用する前提なので、operator new と operator delete は使用禁止にしてあります。また、コピーコンストラクタ・代入演算子も private 宣言することで禁止してあります。
!!参考情報
リソースの取得処理をクラスでラップする基本的な考え方については、「 [[【C++】文字列リソースのための簡単なラッパークラス]] 」 を参照してください。
!!注意事項
上記のクラステンプレートは CodeWarrior 9.0J にて動作確認を行っています。エラー処理についてはそれほど真剣に検討していないので注意してください。基本的にはリソースの取得に失敗すれば、データメンバはすべて初期値になります。
!!コメント
*コメントスパムが来ますので、コメント欄をコメントアウトしました。コメントを追加したい方は、コメント欄の復活させるか、または直接編集してください。- よういち (2007年02月07日 09時05分00秒)
//{{comment multi}}