インスタンスの関数アドレス呼出 – プログラミング – Home

インスタンスの関数アドレス呼出
 
通知
すべてクリア

[解決済] インスタンスの関数アドレス呼出


いずみ
 いずみ
(@いずみ)
ゲスト
結合: 23年前
投稿: 10
Topic starter  

環境:WindowsNT4.0 VC5

現在、インスタンス内の関数を関数アドレスによる呼出をしてみようと
試みていますが、どうしても一つコンパイルエラーが解決できない状態です。

質問内容は2つです。

1.このような手段についての情報を検索エンジンで得ようと思ったときの
  検索キーワード

2.以下のソースのコンパイルエラーの解決手段

// Ccallback.h //////////////////////////////////
class Ccallback
{
public:
Ccallback* pCallback ;
void (Ccallback::*bar)(void) ;

void callfunc();
};

// Ccallback.cpp ////////////////////////////////
#include stdafx.h
#include Ccallback.h

void Ccallback::callfunc()
{
// pCallback->callback::*bar() ; // コンパイルエラー
// pCallback->(callback::*bar)() ; // コンパイルエラー
pCallback->bar() ; // コンパイルエラー
}
// error C2064: 関数ポインタとして評価されない式を使って、関数を呼び出そうとしました。

// テスト用クラス ///////////////////////////////
class CTST0705Dlg : public CDialog
{
~(中略)~
public:
void testcall();
Ccallback m_callback ;
};

BOOL CTST0705Dlg::OnInitDialog()
{
~(中略)~

// インスタンスアドレスと、関数アドレスをコールバック用オブジェクトに設定
m_callback.pCallback = (Ccallback*)this ;
m_callback.bar = (void (Ccallback::*)(void))CTST0705Dlg::testcall ;

~(中略)~
}

void CTST0705Dlg::testcall()
{
AfxMessageBox(テスト成功!) ;
}

以上、みなさまのお知恵をお借りしたいと思います。
よろしくお願い致します。


引用未解決
トピックタグ
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

(pCallback->*bar)();
です。

->* が1個の演算子です。
MSDNだと「メンバへのポインタ演算子」という名前になってます。

ところで、
void (Ccallback::*)()

void (CTST0705Dlg::*)()
は、違う型ですので強引にキャストするのはお勧めできません。


返信引用
いずみ
 いずみ
(@いずみ)
ゲスト
結合: 23年前
投稿: 10
Topic starter  

> (pCallback->*bar)();
> です。

ありがとうございます。
ご指摘の方法で実現できました。

> ところで、
> void (Ccallback::*)()
> と
> void (CTST0705Dlg::*)()
> は、違う型ですので強引にキャストするのはお勧めできません。

はい。
「型が異なる」という点につきましては重々承知しています。
しかし、静的関数の関数アドレス呼出と同等の手順を確立したかったのです。
頻繁に使用するような方法ではない事は理解しているつもりです。

おかげさまで解決しました。
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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