インスタンスの関数アドレス呼出

[戻る]
いずみ 2002/07/08(月) 11:34:25
環境: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 2002/07/08(月) 12:07:19
(pCallback->*bar)();
です。

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

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

いずみ 2002/07/08(月) 12:59:46
[[解決]]
> (pCallback->*bar)();
> です。

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

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

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

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

古いスレッドには追加発言できません。