関数ポインタに問題があります。typedef double (*function)(double *x) const;を介して関数ポインターを定義する基本クラスがあります。
簡単な補足質問: 上記の typedef がコンパイルされないのはなぜですか?
次のエラーが表示されます:エラー: 'function' の 'const' および 'volatile' 関数指定子が型宣言で無効です
以下の部分では、typedef double (*function)(double *x)を使用します。現在、各ドーター クラスは、このタイプの関数の複数の異なるバージョンを実装できます。列挙型を介して、選択した関数を選択します。これにより、非メンバー関数ポインター (基本クラスで定義されている) が、娘クラスのこれらのメンバー関数ポインターのいずれかによって初期化されるように設定されます。コード スニペットを次に示します。
ドーター クラスのソース ファイル:
PndLmdROOTDataModel1D::PndLmdROOTDataModel1D(interpolation_type intpol_type) {
if(intpol_type == CONSTANT) {
setModelFunction(&PndLmdROOTDataModel1D::evaluateConstant);
}
else if (intpol_type == SPLINE) {
setModelFunction(&PndLmdROOTDataModel1D::evaluateSpline);
}
else {
setModelFunction(&PndLmdROOTDataModel1D::evaluateLinear);
}
}
基本クラス (ヘッダー ファイル):
class MultiModel1D: public Model1D {
protected:
function model_func;
public:
MultiModel1D();
virtual ~MultiModel1D();
void setModelFunction(function f);
}
コンパイルすると、次のエラーが発生します。
注: 'double (PndLmdROOTDataModel1D::*)(double*)' から 'function {aka double (*)(double*)}' への引数 1 の既知の変換はありません</p>
速度の問題のため、関数ポインターを使用しています (少なくとも、これは、いくつかのスイッチケースを常に実行するよりも高速であると思います)。私は何を間違っていますか?たぶん、より良い代替手段として役立ついくつかのデザインパターンもあります...よろしくお願いします!
スティーブ