Cpp クラス メンバ関数ポインタ 新しいページはコチラ
提供: yonewiki
(→クラス メンバ関数ポインタ) |
(→クラス メンバ関数ポインタ) |
||
68行: | 68行: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
FunctionPointer001.cppの10/11/15行目がメンバ関数ポインタを実際に利用しようとしている部分になります。サンプルを作ると、どうしてもどこが重要なのかわかり辛くなってしまうのは申し訳ないです。 | FunctionPointer001.cppの10/11/15行目がメンバ関数ポインタを実際に利用しようとしている部分になります。サンプルを作ると、どうしてもどこが重要なのかわかり辛くなってしまうのは申し訳ないです。 | ||
+ | |||
+ | |||
+ | コメント文に★印を入れました。★1.部分のように名前解決をするためにポインタ変数名の前にクラス名を入れたり、★2.部分の代入のときにもアドレス演算子付きで名前解決演算子とともに関数名を指定したり、★3部分の呼び出しでもthisポインタによってポインタの指し示す内容がメンバ関数であり名前解決をすることを実施するような構文になっています。他の通常のポインタと区別する部分であったり、クラス独自の名前解決を必要とする都合を考えればこうするしかなさそうなルールです。あえて、置き換えれる部分があるとしたら★3.部分はアロー演算子を利用しているだけなので | ||
+ | |||
+ | |||
+ | (*this.*pfuncExample1)(100,200); | ||
+ | |||
+ | |||
+ | とすることはできます。他にも★2.部分の代入処理を変数宣言時に初期化という形でまとめることもできます。そうすると★2.部分は不要で、★1.部分がいかのように書き換えられます。 | ||
+ | |||
+ | |||
+ | void (CFunctionPointer001::*pfuncExample1)(int,int)= &CFunctionPointer001::example_function1; | ||
+ | |||
+ | |||
+ | ★3.部分の関数の引数の前のカッコや★1.部分の宣言時における引数部の前のカッコは必ず必要になります。あとは余計なカッコとかをつけると文法上の扱いに問題がでるため大きく変更できる部分はないです。おぼえにくい部分ですが、こういったややこしいメンバ関数ポインタとマクロを組み合わせたり、typedefステートメントで型定義の置き換えを組み合わせたりすることもよく実施されるので、更にややこしさが倍増する表現が増えます。自分のような知能の低い人間は、できるだけ、こういう複雑な記述をさける方向でプログラムするのですが、頭の構造が違う人はかなり駆使される人もいるので、理解するのに無駄に時間がかかってしまいます。 | ||
+ | |||
+ | |||
+ | どういう風に記述するかは、人がきめることだし、文法上は便利だから用意されているものなので、どういうプログラムが正しいとか、そういうのはありませんし、なんでもありです。せめて人が書いたプログラムを理解できる程度に頭を鍛えるしかないです。 |