表示表达式计算c++(多态性设计)

Represent expression calculation c++ (Polymorphism design)

本文关键字:多态性 表达式 计算 c++ 表示      更新时间:2023-10-16

我想在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构造函数就不会被继承,因此不可用。