表示表达式计算c++;(多态性设计) 我想在C++中实现一个非常简单的表达式计算器,例如,计算
(3+2)*8 因此,我为表达式创建了一个基类,如下所示:表示表达式计算c++;(多态性设计) 我想在C++中实现一个非常简单的表达式计算器,例如,计算,c++,C++,(3+2)*8 因此,我为表达式创建了一个基类,如下所示: class Expression { public: virtual ~Expression() {} // Returns the result of evaluating this expression. virtual float eval() const = 0; // Prints the expression. DO NOT evaluate before printing. virtual v
class Expression {
public:
virtual ~Expression() {}
// Returns the result of evaluating this expression.
virtual float eval() const = 0;
// Prints the expression. DO NOT evaluate before printing.
virtual void print() const = 0;
};
然后,为了表示数字,我只关心INT和FLOAT,我做了如下:
/*
* Number
*/
class Number : public Expression {
};
class IntNum : public Number {
public:
IntNum(int num) : m_value(num) {}
~IntNum() {}
float eval() const {return (float) m_value;}
void print() const {std::cout << m_value;}
protected:
int m_value;
};
class FloatNum : public Number {
public:
FloatNum(float num) : m_value(num) {}
~FloatNum() {}
float eval() const {return m_value;}
void print() const {std::cout << m_value;}
protected:
float m_value;
};
问题是:我写作
TwoOpndExp(表达式*exp1,表达式*exp2):m_exp1(exp1),m_exp2(exp2){}
因为没有人知道“+”两边是什么,所以它可以是一个数字,就像“1+2”,也可以是相关的表达式,比如“1+(2^3)”。所以我认为构造函数的para类型应该是Expression*。
但是,当我像这样测试它时:
IntNum* x = new IntNum(3);
FloatNum* y = new FloatNum(4.1);
AddExp* add = new AddExp(x, y);
编译器说找不到的构造函数
AddExp*add=新的AddExp(x,y)
我知道这个类会以para list的形式保存一些东西来找到一个正确的构造函数,但是,就这个问题而言,如何设计使它正确呢
此问题可在现场解决:
见附件5
谢谢。您需要添加另一个构造函数:
AddExp(Expression* exp1, Expression* exp2) : TwoOpndExp(exp1, exp2) {}
如果没有这一点,
TwoOpndExp
构造函数不会被继承,因此不可用。您无法继承构造函数。如果要调用基类构造函数,必须显式定义一个构造函数,然后将其委托给基类。为什么会有这么多指针(在类内部和外部)?我不明白你为什么需要任何指针,而且它比没有更麻烦。乔尔·科内特是对的。要从基类继承非默认(或参数化)构造函数,也必须在派生类中实现它,并且可以委托给基类。请检查此项以供参考
AddExp(Expression* exp1, Expression* exp2) : TwoOpndExp(exp1, exp2) {}