学生向けプログラミング入門

学生向けにプログラミングを解説。Java、C++、Ruby、PHP、データベース

C++プログラミング入門その32 関数ポインタとクラス

<<前  [TOP]


Visual Studioで新規プロジェクトを作り、以下のヘッダーファイルと2つのcppファイルを作成して下さい。


Draw.h 直

/** ヘッダファイル */
/**Draw.h*/

void draw(int max_x, int max_y, int (*func)(int));

#ifdef MAIN

	int max_x;
	int max_y;

#else

	extern int max_x;
	extern int max_y;

#endif



Draw.cpp 直

/** 描画モジュール */
/**Draw.cpp*/

#include<iostream>

void draw(int max_x, int max_y, int (*func)(int)){

	int x;
	int y;
	int arr_x[30];
	int arr_y[30];

	/**配列にx,yの値を格納*/
	for(int j=0; j<max_x; j++){
		x=j;
		y=func(x);

		arr_x[j]=x;
		arr_y[j]=y;
	}

	std::cout << "^"<< std::endl;

	for(int i=max_y; i>0; i--){
		std::cout <<"|";

		if(arr_y[i]>=0 && arr_y[i]<max_y){

			for(int j=0; j< arr_x[i]; j++) {
				std::cout << " ";
			}
			std::cout << "*";
		}
		std::cout << std::endl;

		for(int k=0; k<arr_x[i]; k++){

			if(arr_y[i]>=0 && arr_y[i]<max_y){

				std::cout <<"|"<< std::endl;

			}
		}

	}
	std::cout <<"+";

	for(int l=0; l<max_x; l++){
		std::cout <<"--";
	}
	std::cout << ">" << std::endl;
}



Draw_main.cpp 直

/** mainモジュール */
/**Draw_main.cpp*/

#include<iostream>

#define MAIN
#include "draw.h"

int func(int x);

void main(){

	max_x=30;
	max_y=10;

	draw(max_x, max_y, func);
}

int func(int x){

	return ((x*x)-2*x+1);
}



画面に点を表示するライブラリが「Draw.cpp 直」で、これを呼び出すプログラムが「Draw_main.cpp 直」」です。
ライブラリ側では、どのような関数が渡されているかはわかりません。
関数func()をの関数式を書き換えれば、違う点を描画します。
draw()関数は、描画するx, y方向の広さと、描画する関数のアドレスを渡しています。


draw()内部では、x=0からx=29までfunx(x)を呼び出し、それがy=0からy=9までに入っていれば、配列にその位置を記憶させ、ループで回し、最後に出力して終了しています。


関数ポインタは、関数と同じように利用できます。
引数と返り値を持っています。
実は、C言語の内部では関数名自体が関数へのアドレスそのものとなります。


関数ポインタの宣言は以下のようにします。

関数ポインタの宣言

    変数の型 (* 関数名) ();


例    int (* pfunc)();



関数ポインタの使用方法は簡単です。
関数ポインタに関数のアドレスを代入し、後は普通の関数のように利用します。
関数のアドレスは、関数の名前がアドレスとなっていますので、これを代入するようにします。

int test(void);
int (*pf)();

pf = test;

pf();    /* 呼び出し */



ここで、pf=test();と書くと全く違う意味になるので注意が必要です。


関数ポインタの主な使い方は、関数の引数に関数のアドレスを渡して、関数ポインタで受け取る場合などです。

int test2( int (*pf)() ){
    return pf() * pf();
}

この例では、test2()に関数を渡すことにより、関数test2()の中でそれらの関数を利用することが出来ます。


実行結果です。





<<前  [TOP]