忍者ブログ
ADMIN / ENTRY
カレンダー
08 2017/09 10
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
新刊カレンダー
ブログ内検索
プロフィール
HN:
Nina.A
性別:
男性
趣味:
麻雀、ラノベ、漫画
自己紹介:
MJ4や天鳳等でよく麻雀やってます。もし会ったらよろしくです。
ブログは単なるメモ帳となる予定。
C/C++勉強中の大学生雑記
<<  2017/09  >>
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 
[12]  [11]  [10]  [9]  [8]  [7]  [6]  [5]  [4]  [3]  [2
2017/09/25  11:34:36
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2008/11/10  00:43:29

前のエントリで関数ポインタを少し理解したので、続いてメンバ関数ポインタについて少し学ぶ。

参考:C++編(言語解説) 第34章 メンバ関数ポインタExtrernal Link

今回もとりあえず例を挙げておく。

class vec{
public:
    void resize(int);
};

int main(void){
    vec v;
    vec *w = new vec();
    void (vec::*func)() = &vec::resize;

    (v.*func)(5);
    (w->*func)(5);

    return 0;
}

メンバ関数ポインタの宣言は、

   void   (    vec     ::*   func   )(        );
【返却値】(【クラス名】::*【変数名】)(【引数】);

メンバ関数のアドレス取得は、

&    vec     ::  resize
&【クラス名】::【関数名】
で可能。メンバ関数のアドレス取得は&が必須なので、関数アドレス取得時には常につける癖をつけた方がよさそう。各変数固有のアドレス(上の例ではvec::vのresize関数)を取得するわけではないみたい。

ポインタを介した関数の実行は、

vec v;
(v.*func)(5);
vec* w = new vec;
(w->*func)(5);
の様に、.*演算子か->演算子を用いる。

ちなみに、メンバ関数が静的(static)である場合には、呼び出しは普通の関数の様に呼び出せる。

PR
この記事にコメントする
お名前:
タイトル:
文字色:
メールアドレス:
URL:
コメント:
パスワード:   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
この記事へのトラックバック
この記事にトラックバックする:
Powerd by NINJAブログ / Designed by SUSH
Copyright © メモ帳ブログ All Rights Reserved.
忍者ブログ [PR]