関数ポインタの使いどころ

関数ポインタの使い方 というより,使いどころについて説明します!

 

関数ポインタの使いどころは大きく2点
1点目:速度を上げる
2点目:似ている処理を纏める

です!
では,1点目の速度を上げる事についてカキカキ
main.cpp
—————————————————————————————
 #include <iostream>
 #define MAX_SLIME 5

void GetEnemy01(std::string *Name, int *Number);  
void GetEnemy02(std::string *Name, int *Number);  
void GetEnemy03(std::string *Name, int *Number);  
void GetEnemy04(std::string *Name, int *Number);  
void GetEnemy05(std::string *Name, int *Number);

int mainFunction()  
{   
          // 乱数シード値の設定
          srand(static_cast<unsigned int>(time(NULL)));
          // 関数ポインタの宣言
          void (*GetEnemy[MAX_SLIME])(std::string *, int *);
          // 関数ポインタの配列に 関数を入れる
          GetEnemy[0] = GetEnemy01;   
          GetEnemy[1] = GetEnemy02;   
          GetEnemy[2] = GetEnemy03;   
          GetEnemy[3] = GetEnemy04;   
          GetEnemy[4] = GetEnemy05;

          // 初期化
          std::string Name = “”;   
          int Number = 0;   
          // 乱数の生成
          int EnemyNumber = rand() % 5;   
          // EnemyNumber番目に入っている関数を呼び出す
          GetEnemy[EnemyNumber](&Name, &Number);

           std::cout << “番号:” << Number << “ 名前:” << Name << std::endl;   std::cin >> Name;
          return 0;
}

 void GetEnemy01(std::string *Name, int *Number)  {   *Name = “すらいむ”;   *Number = 1;  }

 void GetEnemy02(std::string *Name, int *Number)  {   *Name = “がったいすらいむ”;   *Number = 2;  }

 void GetEnemy03(std::string *Name, int *Number)  {   *Name = “べほますらいむ”;   *Number = 3;  }

 void GetEnemy04(std::string *Name, int *Number)  {   *Name = “ほいみすらいむ”;   *Number = 4;  }

 void GetEnemy05(std::string *Name, int *Number)  {   *Name = “ばぶるすらいむ”;   *Number = 5;  }
—————————————————————————————
注目するべきはここ↓
void (*GetEnemy[MAX_SLIME])(std::string *, int *);
これが,関数ポインタの宣言にあたります。

これはいったい何をやっているのか!?
実はこれらは,関数ポインタの配列を宣言して,それぞれに関数のアドレスを入れ
あとは,配列の何番目を呼び出すと そういうことをやっています。

もし,1だったら,1を呼び出すとか それを条件判定でやると
関数が増えれば増えるほど,時間がかかります。
理由?

1を選択する時,
もし1ならば1 なら 1回の判定で済みますが
5を選択する時は,
もし1ならば → 違う  もし2ならば → 違う  もし3ならば → 違う・・・
もし5ならば 5 と5回判定する必要があるのです。配列なら,判定要らずですね。

では,続いて,似ている処理を纏める
についてですが,次のページで説明します。

comments

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*