3

メンバー関数をパラメーターとしてグローバル関数に渡す方法はありますか? 私はこれを見つけましが、それは私の問題を本当に解決しません。

次のグローバル関数があるとしましょう。

double Function(double (*fEval)(double F1, double F2),double min, double max,int numArgs,...);

bool Function2(double (*fEval1)(double F1, double F2),double (*fEval2)(double F1, double F2),double xmin, double xmax, double ymin, double ymax,double &ax, double &ay,int numArgs,...);

私のメンバー関数の1つはFunction2を次のように呼び出します

Function2(&F1, &F2, 0, m_m1, 0, m_m2, &m_n1, &m_n2,0);

F1とF2はメンバー関数で、Function2はどこかでFunction1を呼び出しますが、現時点ではFunction2とそれを正しく宣言する方法に問題があります。

さて、関数宣言を次のように変更することができました

bool Function2(double (CLASS::*)(double F1, double F2),double (CLASS::*)(double F1, double F2),double xmin, double xmax, double ymin, double ymax,double *ax, double *ay,int numArgs,...)

そして、おそらく CLASS::* に置き換えられた関数 fEval1 と fEval2 を呼び出そうとしたときに発生する問題が 1 つだけあるので、この関数内で最初と 2 番目のメンバー関数を呼び出すにはどうすればよいですか?

4

2 に答える 2

4

メンバー関数ポインターは、通常の関数ポインターとは異なります。型の一部としてクラスを指定する必要があります。また、それらを呼び出すときは、メンバー関数が呼び出されるオブジェクトを指定する必要があります。

あなたのエラーメッセージは、あなたが渡しているメンバー関数の型が実際にあることを示していますdouble (CLASS::*)(double, double) - これは署名の通常の関数ポインタ型と互換性がありません

メンバー関数ポインターの使用方法の詳細については、こちらの C++ FAQ を参照してください。

http://www.parashift.com/c++-faq-lite/pointers-to-members.html

于 2012-05-04T16:41:55.217 に答える
4

これを行うことはある程度可能ですが、それが本当にやりたいことなのかどうかについては、多くの疑問が生じます。

メンバー関数へのポインターのようなものがありますが、それは基本的に構造体内のオフセットとして機能するため、それを使用するには、メンバー関数へのポインターと、そのメンバー関数を呼び出すオブジェクトの両方を提供する必要があります. あなたがしていることを考えると、あなたが本当にこれを望んでいるとは思えません (少なくとも私には)。

私の即時の反応は、Function1andFunction2をテンプレートとして記述し、関数へのポインターの代わりにファンクターを渡すことです。通常のメンバー関数を指定する代わりに、それぞれが他のファンクターと同じように機能し、オーバーロードoperator()して作業を行います。

編集:可能であれば、可変引数関数の使用も避けたいと思います.C++の明確な禁止事項の1つである型情報を破棄します。特に、C++11 をサポートする新しい C++ コンパイラでは、ほとんどの場合、これを簡単に回避できます (代わりに、オブジェクトを作成する初期化子リストを渡すことができます)。

于 2012-05-04T16:50:37.490 に答える