2

したがって、最初のパラメーターとして関数を受け取る Romberg という関数があります。

int Romberg(double (*f)(double), ... );

実行されると、渡された関数がいくつかの値に適用されます。

クラスでは、次のメソッドを定義しました。

double Funktion::q(double x){
    return(sqrt(1.0+fd(x)*fd(x)));
};
void Funktion::compute_bogen(){
    Romberg(q, ... );
};

fd同じクラスの別のメソッドはどこにありますか。ただし、これは機能しません。コードを次のように変更してみました。これにより、メソッドが Romberg 関数に正常に渡されました。しかし、渡された関数の適用に失敗します:

int Romberg(double (Funktion::* &f)(double), ... );

void Funktion::compute_bogen(){
    Romberg(&Funktion::q, ... );
};

次のエラー メッセージが表示されます。

error C2064: term does not evaluate to a function taking 1 arguments

今のところ、私が構築したクラス システム全体を破棄せずにこれを機能させる方法がわかりません。

4

2 に答える 2

2

次のエラー メッセージが表示されます。

エラー C2064: 項は 1 つの引数を取る関数として評価されません

これは、Funktion::q密かに 2 つの引数、thisポインターとdouble

問題は、 でRombergそれを呼び出すオブジェクトに関する情報Funktion::compute_bogen()がないため、 に渡すことができないことFunktion::q()です。おそらく次のようなものが必要です。

typedef double (Funktion::*RombergFuncArg)(double)

int
Romberg(RombergFuncArg func, Funktion& obj, ... )
{
   double input  = 0.0;
   double output = (obj.*func)(input);
   //...
}

[編集] コメントへの返信:

void Funktion::compute_bogen(){
   Romberg(&Funktion::q, *this, ... );
};
于 2013-05-27T17:13:46.180 に答える
1

クラスシステムでfd機能させるには、関数へのポインターではなく、メンバー関数へのポインターを取るように定義する必要があります (この 2 つは同じではありません)。

次に、メンバー関数へのポインターに対しても正しく呼び出す必要があります (関数へのポインターの呼び出しとは少し異なります)。

これを行うことはできますが、多少異なる構造を検討した方がよい場合があることに注意してください。かなり一般的なのは、さまざまな派生クラスでオーバーライドする仮想関数を使用することです。次に、メンバー関数へのポインターを使用する代わりに、必要な関数を実装するオブジェクトを選択し、そのオブジェクトで仮想関数を呼び出します。

于 2013-05-27T16:56:16.770 に答える