【发布时间】:2015-02-25 03:54:16
【问题描述】:
我有以下抽象基类:
class Function {
virtual double Eval(double x) const = 0;
};
我希望能够在我的主文件中使用 f * g 或 f->operator *(g) 之类的表达式,其中 f 和 g 是 Function 类的具体对象,例如当我想计算时一个定积分,以便我可以写:
AnIntegrationMethod(f*g);
我想出的一个相当简单的方法是声明一个 Product 类(只显示头文件,实现很明显):
class Product: public Function {
public: Product(Function *g, Function *f);
~Product();
virtual double Eval(double x) const; //return _g->Eval(x)*_f->Eval(x)
private: Function *_g; Function *_f;
};
然后在我的任何函数中
#include "Product.h"
class ConcreteFunction: public Function {
public:
ConcreteFunction();
~ConcreteFunction();
virtual double Eval(double x) const;
Function* operator*(Function *f) {return new Product(this, f);}
};
这实际上适用于简单的东西,但问题是运算符 * 仅在基类的单个派生类中定义,而不是为每个可能的派生类定义。这意味着,例如,如果我有一个表示数学函数的具体对象 f,我可以调用 f->operator *g 但如果我想再次调用 operator * 来获取对象 (f->operator * g)- >operator * f 我不能这样做,因为函数 f* g 没有将 * 运算符定义为 f。
我想我应该直接在我的基类中定义运算符 * 但是我不知道如何实现该运算符,因为我真的不知道如何为产品获取正确的 Eval 函数,因为我无法使用现在是 Product 类,在类 Function 本身中使用从类 Function 派生的类 Product 是没有意义的。我想我也很困惑,一般来说写如下内容是否正确:
Function* Function::operator*(Function *f) {
Function *g;
...
//operations that allow g to be have the right Eval function
//which should of the sort this->Eval(x) * f->Eval(x)
...
return g;
}
感谢任何有关如何进行的提示或建议。我的水平很基础,已经编程两个月了。
【问题讨论】:
-
“return new ...”很可能是内存泄漏。 (或设计噩梦)
-
您是在乘以函数(数学表达式)还是从函数计算的值?乘法函数(数学表达式)有意义吗?
-
这种设计不会带来任何好处。如果我理解你想要做什么,你很可能要么想玩矢量,要么为泛型分类创建自己的模板。
-
我发布了一个基本的模板解决方案,它可以在堆栈上工作,而不是强迫您使用动态分配和自动删除。