-5

次のコードを確認してください。なぜそれが間違っているのか、どのように修正するのですか?ありがとうございました。

class A
{
  public:

    class B
    {
      public:
        B(int(*cf)())
        {
            f = cf;
        }

        int (*f)();
    };


    B *b;


    A()
    {
        b = new B(this->a);
    }


    int a()
    {
    }
};

int main()
{
    A a;
}

コンパイル エラー:

4

2 に答える 2

1

絶対にポインターで関数を呼び出す必要がある場合は、関数へのポインターではなく、メンバー関数へのポインターを使用する必要があります。メンバー関数へのポインターには、関数が属するクラス型を含む別の宣言構文があります。あなたの場合、パラメータ宣言は次のようになりますint (A::*cp)()fまた、メンバー変数の宣言を に変更する必要がありますint (A::*f)()

メンバー関数へのポインターを呼び出すには、関数が属する型のオブジェクトへのポインターが必要です。また、メンバー演算子へのポインターのいずれかを使用する必要があります。->*また.*

void call(A* c, int (A::*f)())
{
    (c->*f)(); // call member function through pointer
}

演算子の優先順位のため、余分な括弧のセットが必要です。

次のコードには、メンバー関数へのポインターを使用するために必要な変更が含まれています。

class A
{
public:

    class B
    {
    public:

        // Take a pointer to member function.
        B(int(A::*cf)())
        {
            f = cf;
        }

        void call(A* c)
        {
            (c->*f)();
        }

        int (A::*f)();  // pointer to member function
    };


    B *b;


    A()
    {
        b = new B(&A::a);
    }


    int a()
    {
        return 0;
    }
};

int main()
{
    A a;
    a.b->call(&a);
}

std::functionまた、and std::bind(または C++11 コンパイラがない場合は同等の Boost) の使用を検討することをお勧めします。

于 2013-06-27T18:13:47.347 に答える