クラスでのポインタ関数

[戻る]
ザンギェ 2001/10/22(月) 12:49:56
クラスで定義された関数をポインタ関数として持たせたいのですが、
どうしてもキャストできませんといわれてしまいます。
実際は、下のような使い方をしたいのですが、どなたか方法をお教えください。
class tor
{
public:
    tor(void);
    void test1(void);      // 処理1
    void test2(void);      // 処理2
    void test3(void);      // 処理3
    void test4(void);      // 処理4
};
tor::tor(void){}
void tor::test1(void){}
void tor::test2(void){}
void tor::test3(void){}
void tor::test4(void){}

void main()
{
    tor aa;
    {
        void (*loop[])(void)={      // ポインタ関数
              (void (*)(void))test1,      // エラー キャスト変換できません
              (void (*)(void))test2,      // エラー キャスト変換できません
              (void (*)(void))test3,      // エラー キャスト変換できません
              (void (*)(void))test4,      // エラー キャスト変換できません
        };
        // ココの処理をさせたい
        for(int i=0;i<4;i++)
        {
              loop[i]();
        }
    }
}

ザンギェ 2001/10/22(月) 12:57:50
すいません。少々、訂正をさせていただきました。
こちらが本当に行いたかった処理の内容です。
どうか お願いします。
class tor
{
public:
    tor(void);
    void test1(void);      // 処理1
    void test2(void);      // 処理2
    void test3(void);      // 処理3
    void test4(void);      // 処理4
    void main(void);
};
tor::tor(void){}
void tor::test1(void){}
void tor::test2(void){}
void tor::test3(void){}
void tor::test4(void){}
void tor::main(void)
{
    void (*loop[])(void)={      // ポインタ関数
        (void (*)(void))tor::test1,      // エラー キャスト変換できません
        (void (*)(void))tor::test2,      // エラー キャスト変換できません
        (void (*)(void))tor::test3,      // エラー キャスト変換できません
        (void (*)(void))tor::test4,      // エラー キャスト変換できません
    };
    // ココの処理をさせたい
    for(int i=0;i<4;i++)
    {
        loop[i]();
    }
}

void main()
{
    tor aa;
    aa.main();
}

クラフトマン 2001/10/22(月) 17:34:10
エラーメッセージをしっかり読みましょう。
この場合は、『XXXからYYYへのキャストはできません』みたいな
メッセージが表示されるはずです。(XXXが正しい宣言の型)
これは、クラスメンバへのポインタなので、
    void (tor::*loop[])(void)={
と書くのが正解だと思います。
また、呼び出し部分もこれではエラーになると思います。
詳細は、MSDNで調べてください。
たぶん、『クラス メンバ ポインタ』あたりで検索をか
けると、出てくると思います。
(試してないのでキーワードは臨機応変に)
#でも、この書き方ってメンテナンス性はいいのかなあ?

ザンギェ 2001/10/23(火) 13:01:17
[[解決]]
ヘルプを見てなんとか呼び出すことに成功しました。
どうもありがとうございます。

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