C++ で実際の関数を実装したいと考えています。特に、そのようなオブジェクトを評価、微分、追加、乗算したいと考えています。これが私の実装です
class RealFunc {
public:
virtual int Eval(const double& x, double& result) = 0;
virtual int Diff(const double& x, double& result) = 0;
};
class Sqrt : public RealFunc {
public:
int Eval(const double& x, double& result);
int Diff(const double& x, double& result);
};
int Sqrt::Eval(const double& x, double& result) {
if(x<0) return 0;
else {
result = sqrt(x);
return 1;
}
};
int Sqrt::Diff(const double& x, double& result) {
if(x<=0) return 0;
else {
result = 0.5/sqrt(x);
return 1;
}
};
オブジェクトを追加しようとすると、扱いにくくなりRealFunc
ます。から継承する合計クラスを作成する必要がありますRealFunc
RealFunc operator+(const RealFunc& f, const RealFunc& g) {
Sum_RealFunc h(f,g);
return h;
};
class Sum_RealFunc : public RealFunc {
public:
Sum_RealFunc(const RealFunc& f_, const RealFunc& g_) : f(f_), g(g_) {};
int Eval(const double& x, double& result);
int Diff(const double& x, double& result);
private:
RealFunc f;
RealFunc g;
};
int Sum_RealFunc::Eval(const double& x, double& result) {
double temp_f,temp_g;
int success_f,success_g;
success_f = f.Eval(x,temp_f);
success_g = g.Eval(x,temp_g);
result = temp_f+temp_g;
return success_f*success_g;
};
// Same for Sum_RealFunc::Diff
ここでの私の問題は、抽象的であるためf
のg
メンバーとして使用できないことです...クリーンな実装を取得するにはどうすればよいですか?Sum_RealFunc
RealFunc
PS:私が置いたコードは、私が取り組んでいるものの軽量バージョンです(すべての微分方向を持つRxR-> Rからの関数、ステップサイズメンバーがゼロでない場合の有限差分、および他のサイド関数)