我想在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 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;
};
最后,我想表示ADD,它需要两个操作数:
/*
* Two oprand expression
*/
class TwoOpndExp : public Expression {
public:
TwoOpndExp(Expression* exp1, Expression* exp2) : m_exp1(exp1), m_exp2(exp2) {}
~TwoOpndExp() {}
protected:
Expression* m_exp1;
Expression* m_exp2;
};
/*
* Add expression
*/
class AddExp : public TwoOpndExp {
public:
float eval() const;
void print() const;
};
问题是:我写
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来找到合适的构造函数,但是,对于这个问题,如何设计才能使它正确?
此问题可在现场解决:
http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-088-introduction-to-c-memory-management-and-c-object-oriented-programming-january-iap-2010/assignments/
参见ass5
谢谢。
您需要添加另一个构造函数:
AddExp(Expression* exp1, Expression* exp2) : TwoOpndExp(exp1, exp2) {}
如果没有这一点,TwoOpndExp
构造函数就不会被继承,因此不可用。