関数ポインタの使い方 というより,使いどころについて説明します!
関数ポインタの使いどころは大きく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回判定する必要があるのです。配列なら,判定要らずですね。
では,続いて,似ている処理を纏める
についてですが,次のページで説明します。