表示表达式计算c++;(多态性设计) 我想在C++中实现一个非常简单的表达式计算器,例如,计算

表示表达式计算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

(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;
};
问题是:我写作

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) {}