【发布时间】:2012-05-29 10:06:42
【问题描述】:
我想用 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 的 sum 类
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 的函数,具有所有微分方向,如果 stepsize 成员不为零则为有限差分以及其他辅助函数)
【问题讨论】:
-
您的问题是XY Problem 的症状。 为什么你认为你需要一个
RealFunc抽象基类? 为什么这个基类有double属性?在我看来,这是一个非常混乱的设计,到目前为止提出的解决方案只会让它变得复杂。 -
你说得对,我的问题是我的设计。到目前为止我得到的答案很复杂,但我最初的问题很简单。我想基本上添加函数,一个函数是一个包含其评估 f(x) 及其精确导数的对象(尽管可以触发使用有限差分进行微分的选项)。
-
当 diff 返回一个数字时,你将如何评估高阶导数?
-
@MatthieuM。我认为问题在于,在我的实现中,函数 sqrt 不是
RealFunc类的对象,而是另一个子类。 -
@user877329 在此示例中,
Diff代表“一阶导数”。在我的实际实现中,我使用两个变量的函数,我只对二阶导数感兴趣,所以我得到了DiffX、DiffY、DiffXX。
标签: c++ operator-overloading constants abstract-class