2

次の問題に遭遇しました。私はクラスを持っています:

class My_Class
{
    public:
    My_Class(void);  // constructor
    double * Return_Values(double x, double y);  // returns a pointer to the array
}

class から完全に独立させたい (そして何らかの理由で必要な) 別のクラスもありますMy_Classが、それには に似た関数を必要とするメソッドがありますMy_Class::Return_Values(double x, double y)。そこで、関数ポインターを渡すことにしました。

class Independent_Class
{
    public:
    Independent_Class(); // constructor
    void Crazy_Method(int a, int b, double * (*FunctionToOperate)(double,double));
}

ここで、コードの本体で次のことを行います。

double * (My_Class::*pt2Member)(double,double) = NULL;                
pt2Member = &My_Class::Return_Values;
Fields = (My_Class_instance.*pt2Member)(0.0,0.0); // this works perfectly

今、私は少しごまかそうとしています (そうです、関数ポインターがクラスメンバーへのポインターと同じではないことは知っていますが、それでも試しました)。

double * (*func)(double,double);
func=pt2Member;     // Doesn't work
Independent_Class_instance.Crazy_Method(1,1, &(My_Class_instance.*pt2Member))  //Doesn't work

したがって、そのアイデアは機能しませんでした。なにが問題ですか?どういうわけか私がやりたいことをすることはできますか(クラスを独立した状態に保つ)?

4

2 に答える 2

4

オブジェクトへのポインタをバインドする必要があります。と を使用することをお勧めしstd::functionますstd::bind。なんらかの理由で絶対に生の関数ポインターを使用しなければならない場合を除き、これによりコードがよりクリーンになります。

これが例です。これは記憶を失っているので、正確ではないかもしれませんが、 がいかに単純であるかを示していますstd::function。これは C++11 で標準ライブラリに追加されたことに注意してください。非常に古いコンパイラを使用している場合 (GCC 4.4 で機能がサポートされている場合でも)、Boost を使用する必要があります。stdその場合は、すべての を以下のに置き換えてboostください。

#include <functional>

class Independent_Class
{
    public:
    Independent_Class(); // constructor
    void Crazy_Method(int a, int b, std::function<double* (double,double)> FunctionToOperate);
}


std::function<double* (double, double)> func; 
func = std::bind(&My_Class::Return_Values, My_Class_instance, _1, _2);
Independent_Class_instance.Crazy_Method(1,1,func);
于 2012-08-24T03:54:18.170 に答える
2

クラスのメソッドは、そのメソッドを呼び出しているオブジェクトへのポインターを表す暗黙的な引数を取ります。つまり、メソッド

void MyClass::foo(int, int);

実際には

void foo(MyClass*, int, int)

この変換はコンパイラでシームレスに行われますが、多くの場合デバッガで効果を確認できます。this結局のところ、ポインタが存在する方法です。

メソッドはオブジェクトを表すポインター引数を暗黙的に想定しているため、通常の関数ポインターだけを使用することはできません。

于 2012-08-24T03:56:41.683 に答える