http://report.mita.minato.tokyo.jp/article.php?story=20071019203458237
http://d.hatena.ne.jp/RiSK/20071121/1195613818
関数を定義するときは、通常は
int function(int parameter1,int parameter2)
{
(関数の中身の記述)
}
とするわけだが、このとき、function()という関数の定義とともに、functionという名前の変数も一緒に定義される。そして、そのfunctionという変数には、function関数へのポインタが入っている。
あれ、いつの間にかVB6.0講座になってるよ?
要するに「関数」を、「変数」のように扱うことができるからだ。
え?それって・・・と、思った方は鋭い。
ここまで読んで「え?それって…」なんて一つも思わなかったよ、俺は。
まさに、プロシージャとデータが同列に扱える、という「オブジェクト指向」そのもの、なんだな。
なんだな。
って、言われてもなぁ……サイのライノックスしか思いつかないよ?
ていうかさ、いつからオブジェクト指向って関数と変数を同一視するものになったのよ。
そして、この関数が構造体に「ポインタ変数として」登録できる、ということになるから、つまりはそれが「クラス」ということになる。
ああ、俺もそれ、やった事あるよ。どうにかして関数から、構造体の宣言にアクセスできるように必死こいてやった事あるよ。結局、一般的なクラスにはならなかったよ。
ていうか、この人はJavaとかC++とかやった事ないんだろうか……privateとか、protectedとか、メソッドからフィールドの参照・書き換えができないCの構造体を、どうしてクラスって言い張れるんだろう……
実は、C言語ってのは、その言語をよく知っている人にとっては、それができた最初から「オブジェクト指向」的プログラミングが可能になっていたのだ。
これはきっと、C言語を使ってオブジェクト指向がパラダイムの、新しい言語を作れるって事を言いたいんだよね!
決してC言語でオブジェクト指向がやれるって言いたいわけじゃないよね!
ということで、「関数へのポインタ」ができる、ということは、単にそれだけにとどまらない、大きな可能性を持ったプログラミングへの入り口だったわけだ。
大きな可能性 = 関数ポインタの無理解による、大量のバグ。
ひどいねー、これは。
初心者がこの記事を見ない事を祈るばかりだよ……
ところで、
C言語でも関数へのポインタを用いて多態を実現できます。
http://d.hatena.ne.jp/RiSK/20071121/1195613818
これって、コールバック関数の事……だよね?ね?[´・[ェ]・]