8

クラス内で関数ポインタのテーブルを作成しようとしています。私はこれの例をオンラインで見つけることができませんでした。ほとんどの場合、クラス外でメンバー関数ポインターを使用する必要があります。

例えば:

class Test
{
    typedef void (Test::*FunctionType)();
    FunctionType table[0x100];

    void TestFunc()
    {
    }

    void FillTable()
    {
        for(int i = 0; i < 0x100; i++)
            table[i] = &Test::TestFunc;
    }   

    void Execute(int which)
    {
        table[which]();
    }
}test;

「termは0個の引数を取る関数に評価されません」というエラーが表示されます。

4

3 に答える 3

19

関数の次の行Execute:

table[which]();

通常の関数ではないため、そのように呼び出すことはできません。関数へのポインターではなく、メンバー関数へのポインターであるため、操作するオブジェクトを提供する必要があります (違いがあります)。

(this->*table[which])();

これにより、thisポインターが指しているオブジェクト(実行中のオブジェクト)が呼び出し元のオブジェクトになりますExecute

また、エラーを投稿する場合は、エラーが発生した行を必ず含めてください。

于 2011-05-06T03:30:59.110 に答える
2

セスは正しい答えを持っています。次回、MSDN でコンパイラ エラー番号を調べると、同じことが表示されます: Compiler Error C2064

于 2011-05-06T03:34:01.150 に答える
1

関数を呼び出すコンテキストが必要です。あなたの場合、コンテキストはthis次のとおりです。

void Execute(int which)
{
    (this->*table[which])();
}
于 2011-05-06T03:38:28.403 に答える