関数テーブルの登録と登録した関数の実行方法について
- 関数テーブルとテーブルに登録する関数の定義
- 関数テーブルの登録、テーブルに登録した関数の実行、テーブルに登録する関数の処理の実装
- 関数テーブルを使用する側の実装
#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); };
" #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; }
// メイン処理 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; }