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

[戻る]
さとぴん 2001/03/06(火) 18:47:44
クラスで定義したメンバ関数のポインタを取得し、そのポインタを利用して関数の呼び出す方法がわかりません。ご教授下さい。
※VC++6.0で開発しています。

2001/03/07(水) 11:19:00
何が解らないんでしょう?

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

しゃむねこ 2001/03/08(木) 16:40:41
いきなり横からすみません。VC++開発暦4ヶ月の初心者です。
私もまったく同じ物が分かりませんので、よろしければ一緒に教えてください。

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

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

2001/03/08(木) 20:51:29
メンバ関数のポインタの所得ですが、基本的に関数ポインタと変わりません。
注意するのは関数の呼び出し方法です。

例です。
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; の時点では有効でも、呼び出し時点では破棄されているかもしれない)
このような曖昧な呼び出しを通さない為にクラスを指定する必要がある・・・と思います。

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