関数テーブルの実装

関数テーブルの登録と登録した関数の実行方法について

  1. 関数テーブルとテーブルに登録する関数の定義
  2. #pragma once
     
     // デバッグ確認用のマクロ(関数テーブルには無関係)
    #ifdef _DEBUG
    #   define MyOutputDebugString( str, ... ) \
          { \
            TCHAR c[256]; \
            _stprintf_s( c, str, __VA_ARGS__ ); \
            OutputDebugString( c ); \
          }
    #else
    #    define MyOutputDebugString( str, ... ) // 空実装
    #endif
     
    // 関数テーブル管理クラス
    class CTableMng
    {
    public:
        // コンストラクタ
        CTableMng(void);
        // デストラクタ
        ~CTableMng(void);
        // 関数テーブル
        static int (CTableMng::*FuncTable[])(int);
        // 関数テーブル実行処理
        int ExecFunc(int iParam);
    private:
        // 関数テーブルに登録する関数その1
        int Test1(int iParam);
        // 関数テーブルに登録する関数その2
        int Test2(int iParam);
        // 関数テーブルに登録する関数その3
        int Test3(int iParam);
    };
    
  3. 関数テーブルの登録、テーブルに登録した関数の実行、テーブルに登録する関数の処理の実装
  4. "
    #include "TableMng.h"
     
    // 関数テーブル
    // 関数を登録
    int (CTableMng::*CTableMng::FuncTable[])(int) =
    {
          &CTableMng::Test1
        , &CTableMng::Test2
        , &CTableMng::Test3
        , NULL
    };
     
    // コンストラクタ
    CTableMng::CTableMng(void)
    {
        // 処理なし
    }
     
    // デストラクタ
    CTableMng::~CTableMng(void)
    {
        // 処理なし
    }
     
    // 関数テーブル実行処理
    int CTableMng::ExecFunc(int iParam)
    {
        if(NULL != FuncTable[iParam])
        {
            return (this->*FuncTable[iParam])(1);
        }
        return 0;
    }
     
    // 関数テーブルに登録する関数その1
    int CTableMng::Test1(int iParam)
    {
        return iParam + 10;
    }
     
    // 関数テーブルに登録する関数その2
    int CTableMng::Test2(int iParam)
    {
        return iParam + 20;
    }
     
    // 関数テーブルに登録する関数その3
    int CTableMng::Test3(int iParam)
    {
        return iParam + 30;
    }
    
    
  5. 関数テーブルを使用する側の実装
  6. // メイン処理
    int _tmain(int argc, _TCHAR* argv[])
    {
        CTableMng cTblMng;
        MyOutputDebugString( _T("%d\n"), cTblMng.ExecFunc(0) );
        MyOutputDebugString( _T("%d\n"), cTblMng.ExecFunc(1) );
        MyOutputDebugString( _T("%d\n"), cTblMng.ExecFunc(2) );
     
        return 0;
    }
    
スポンサーリンク
スポンサーリンク
スポンサーリンク
  • このエントリーをはてなブックマークに追加

コメントをどうぞ

メールアドレスが公開されることはありません。