0

実行時に関数ポインタを設定したい。しかし、私はここで立ち往生しています。グローバル関数または静的クラスメンバー関数を使用すると、すべて問題ありません。ただし、関数が通常のクラスメンバー関数の場合。私はいつもコンパイラエラーが発生しました。コードは次のとおりです。

class A   
{
    int val;
public:
    A() { val = 0; }
    A(int j) { val = j; }

    int aFun(int k) {val -= k; return val; }
};

typedef int (* func)(int );
class B
{
    func m_addr;
public:
    B(func param)
        : m_addr(param)
    {

    }
    void execute()
    {
        cout << m_addr(9) << endl;
    }
};

私はこれらを次のように使用しようとしています:

/ *エラーC2355:'this':非静的メンバー関数内でのみ参照できますエラーC2064:用語は1つの引数を取る関数に評価されませんクラスは'operator()'またはユーザー定義の変換演算子を定義しません適切な数の引数を取る関数へのポインタまたは関数への参照*/

A a;
B b(A::aFun); 
b.execute();

たくさんググった後、私はそれstd::mem_funが役立つかもしれないと思いました。でも使い方がわかりません。誰かが私を助けることができますか?

PS:Visual C++2010を使用しています

4

3 に答える 3

4

クラスメンバー関数には、 と呼ばれるコンパイラによって渡される追加のパラメータがあるthisため、コンパイラはaFunbegin 宣言され、次のように記述されていると認識します。

int A::aFun(A* this, int k)
{
    this->val -= k;
    return this->val;
}

静的/グローバル関数にはこのパラメーターがないため、コンパイルは成功します。

使用するには、どこかA::aFunにクラスのインスタンスが必要です。A

于 2012-12-02T04:04:03.983 に答える
0

何をしようとしているのか正確にはわかりませんでしたが、エラーが表示されました。おそらく役に立ちます。

それは関数へのポインタですよね?

 typedef int (* func)(int );

しかし、関数はありません。クラスのメソッドがあります。(メンバー関数)したがって、typedefは確率でなければなりません:

typedef int (A::*func)(int );

メンバー関数へのポインターをグーグルで検索すると、いくつかの例が見つかります。

幸運を!

于 2012-12-02T23:15:06.507 に答える
0

次のように変更されました。

static int val;

class A   
{

public:
    A() { val = 0; }
    A(int j) { val = j; }

  static  int aFun(int k) {val -= k; return val; }
};
于 2012-12-02T11:11:12.343 に答える