ネタ元:Visual Basic でなんとなくイベントとデリゲート その4。 - デリゲートとは? -
チラ裏でも書いたので、関数ポインタ(だけ)について。
変数にポインタがありますが、これと同様に関数にもポインタが使えます。
関数にはアドレス定義されていますので、このアドレスをさすポインタを作ってやることで関数ポインタとして動作させることができます。
ただし、関数は変数と違って、引数や戻り値というものが存在しますので、関数ポインタの宣言は定義先の関数ポインタを同じものを定義します。
戻り値 (*ポインタ名)(引数);
このようにすることで、classの定義がないC言語でもクラス(の、ようなもの)と同じような書き方ができます。
あまりよろしくないですが、使用例。
#include "stdio.h"
/* console構造体を定義 */
typedef struct _console {
int (*Write)(const char *, ...);/* Writeという関数ポインタを定義する */
} console;
console Console;/* グローバル変数領域 */
int main(int argc, char* argv[])
{
int a,b,c; /* 整数を定義 */
a = 2; /* 変数にテキトーに値を突っ込む */
b = 3;
c = a + b;
Console.Write = printf; /* Console構造体内部Writeポインタをprintfと同等にする */
Console.Write("a= %d, b= %d, c = %d\n",a,b,c);/* printfと同様に使える */
return 0;
}
実行結果
a = 2, b = 3, c = 5
Console構造体に配置されているWrite関数ポインタを呼び出すと、内部的にprintfが呼ばれます。
# 余談ですが、最初C++のclassというものがわけわからなかったときにこういう理解をしました^-^;
投稿日時 : 2007年10月25日 10:32