0

私は次のコードを持っています:

#include <iostream>
using namespace std;

class A
{
    int m_value;
public:
    A(int value)
    {
        m_value = value;
        funcA(&A::param);
    }

    void funcA(void (A::*function)(int))
    {
        (this->*function)(m_value);
    }

    void param(int i)
    {
        cout << "i = " << i << endl;
    }
};


int main()
{
    A ob(10);

    return 0;
}

別の関数をパラメーターとして受け取る関数を呼び出すクラスがあります。関数呼び出しは行にありfuncA(&A::param)ます。私が欲しいのは、クラススコープを指定する必要なしにパラメーターとして関数を渡すことができることですfuncA(&param)。また、私はsを使いたくなかったのでtypedef、コードが少し「ダーティ」になっています。

これを達成する可能性はありますか?

4

3 に答える 3

0

これはできません。クラス内の関数ポインタは、クラススコープ(A :: function)を使用して識別する必要があります

于 2012-11-01T14:19:49.097 に答える
0

それはちょっと醜いです。

最初に確認すべきことは、代わりに継承と動的ディスパッチを使用するように再コーディングすることです。これを行うには、funcA が呼び出す仮想メソッドを持つように A クラスを変更します。

class A {
...
    void funcA () {
       custom_function(m_value);
    }
protected:
   virtual void custom_function (int)=0;
}

使用するすべての異なる custom_function に対して、A から派生した新しいクラスを宣言し、そこに関数を実装します。funcA から自動的に呼び出されます。

class A_print : public A {
public:
    virtual void custom_function (int param) { 
       std::cout << "param was " << param << std::endl;
    }
}

それが十分に柔軟でない場合、次善の C++ っぽい解決策は、ファンクター(関数として機能し、おそらく()演算子をオーバーライドするオブジェクト) を実装することです。

于 2012-08-31T15:17:59.137 に答える
-1

これができない理由がわかりません:

#include <iostream>
using namespace std;

class A
{
    int m_value;
public:
    A(int value)
    {
      param(value);
    }

    void param(int i)
    {
        cout << "i = " << i << endl;
    }
};

int main()
{
    A ob(10);
    return 0;
}
于 2012-08-31T15:14:09.347 に答える