クラスのメンバ関数を関数ポインタにするには?また、その関数を呼ぶには? – プログラミング – Home

クラスのメンバ関数を関数ポインタにする...
 
通知
すべてクリア

クラスのメンバ関数を関数ポインタにするには?また、その関数を呼ぶには?


さとぴん
 さとぴん
(@さとぴん)
ゲスト
結合: 24年前
投稿: 1
Topic starter  

クラスで定義したメンバ関数のポインタを取得し、そのポインタを利用して関数の呼び出す方法がわかりません。ご教授下さい。
※VC++6.0で開発しています。


引用解決済
トピックタグ
重
 重
(@重)
ゲスト
結合: 24年前
投稿: 84
 

何が解らないんでしょう?

1.関数ポインタ?
2.メンバ関数のポインタの所得?
3.「2.」を使っての関数の呼び出し方法?


返信引用
しゃむねこ
 しゃむねこ
(@しゃむねこ)
ゲスト
結合: 24年前
投稿: 1
 

いきなり横からすみません。VC++開発暦4ヶ月の初心者です。
私もまったく同じ物が分かりませんので、よろしければ一緒に教えてください。

私の場合、
2.メンバ関数のポインタの所得方法
3.「2.」を使っての関数の呼び出し方法
が分かりません。
関数ポインタはなんとなく理解してると思うのですが・・・

よろしくご指導願います。


返信引用
重
 重
(@重)
ゲスト
結合: 24年前
投稿: 84
 

メンバ関数のポインタの所得ですが、基本的に関数ポインタと変わりません。
注意するのは関数の呼び出し方法です。

例です。
class CTest
{
public:
CTest();
~CTest();

void Call(void);

void Summoned(int);
};

void CTest::Call()
{
void(CTest::*fp)(int); // ←クラス名が付くだけです。

fp = Summond; // ←Summondのアドレスが入ります。

(this->*fp)(100); // ←この例では、thisを使っています。
// クラスを指定しなければいけません。
}

void CTest::Summoned(int i)
{
printf(NO : %d, i);
}

この例を他のクラスから呼び出すときは・・・変わりませんね。
void C???::Call()
{
CTest cTest;

void(CTest::*fp)(int);

fp = cTest.Summoned;

(cTest.*fp)(100);
}

メンバ関数のポインタはクラスを指定しないとコンパイルで、エラーになります。
(this->*fp)(100);
これを
*fp(100);
このようにすると
「関数ポインタとして評価されない式を使って、関数を呼び出そうとしました。」
と言ってきます。(VC++6.0の場合)

この場合には解りにくいかもしれませんが、他のクラスからの場合
(cTest.*fp)(100);
これを
*fp(100);
こうした場合、呼び出し時にcTestが有効か分かりません。
(fp = cTest.Summoned; の時点では有効でも、呼び出し時点では破棄されているかもしれない)
このような曖昧な呼び出しを通さない為にクラスを指定する必要がある・・・と思います。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました