PPLKB-21:【C++】リソースのための汎用クラステンプレート - project-enigma

PPLKB-21:【C++】リソースのための汎用クラステンプレート

>> Site top >> Misc >> In my palm >> Palm開発情報 >> PPLKB-21:【C++】リソースのための汎用クラステンプレート

最終更新日付:2014/01/01 00:00:00

リソースのための汎用クラステンプレート

概要

【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 にて動作確認を行っています。エラー処理についてはそれほど真剣に検討していないので注意してください。基本的にはリソースの取得に失敗すれば、データメンバはすべて初期値になります。

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.