1

関数ポインタは初めてですので、よろしくお願いします。私は方法を持っています:

int test3(int i)
{
    return i;
}

次に、別の方法(メインではない)で私は行います:

int (*pTest3)(int) = test3;

私が読んだ例から、これは大丈夫のようです。ただし、コンパイル時エラーが発生します。

testFile.cpp:277:25:エラー:タイプ'int({anonymous} :: CheckingConsumer ::)(int)'の引数が'int(*)(int)'と一致しません</ p>

何が悪いのかわかりません。どんな助けでもいただければ幸いです。

どうもありがとう。

4

2 に答える 2

7

あなたtest3はまたはのメンバー関数structですclass。クラスメンバー関数には非表示のthisパラメーターが渡されるため、プレーン関数ポインターでは使用できません。関数をとして宣言するか、 /staticの外に移動して、非表示のパラメーターがなくなるようにするか、関数ポインターの代わりにクラスメソッドポインターを使用する必要があります。structclassthis

// static class method:
class X
{
    static int test3(int i)
    {
        ...
    }
};

// Non-class method, at global scope
int test3(int i)
{
    ...
}

// Class method pointer
class X
{
    int test3(int i)
    {
        ...
    }
};

// Create the method pointer
int (X::*pTest3) = &X::test3;
X *obj;
// Call the method pointer on an object
(obj ->* pTest3)(42);
于 2012-08-09T15:01:40.387 に答える
0

あなたのメソッドtest3はインスタンスメソッドのようです。後でpTest3、メンバー関数ポインターとしてではなく、関数ポインターとして定義します。

単純なポインターとメンバー ポインターの主な違いは、メンバー ポインターを使用するにはオブジェクトのインスタンスが必要なことです。オブジェクトのインスタンスは、どのオブジェクトを処理する必要があるかを示し、ポインターの値は、オブジェクトのどのデータ フィールドを使用するか、またはどのメンバー関数を呼び出す必要があるかを示します。メンバー ポインターの値は、概念的には、オブジェクトの先頭からそのメンバーまでのオフセットと同等です。

typedef を使用してメンバー ポインターを宣言します。

typedef int (SomeClass::*MyMethodPtr)(int i);
MyMethodPtr ptr3 = SomeClass::test3;

このポインタを使用して:

class SomeClass *pab = &ab;
int ret_value = (pab->*ptr3)(4);

クラスのインスタンスが使用されることに注意してください。メンバー ポインターについては、他にも重要な点があります。これらは、コンパイラや多重継承、仮想基本クラスの存在などの他の側面に応じて、2 ~ 5 個の単純なポインターとオフセットを内部に含む構造体として実装されます。

于 2012-08-09T15:42:16.957 に答える