Я хочу реализовать очень простой калькулятор выражений в 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)». Поэтому я думаю, что тип конструктора должен быть выражением *.
Но когда я проверяю это как:
IntNum* x = new IntNum(3);
FloatNum* y = new FloatNum(4.1);
AddExp* add = new AddExp(x, y);
компилятор сказал, что конструктор не найден для
AddExp * add = new AddExp (x, y);
Я знаю, что класс будет содержать что-то в виде списка параметров для поиска правильного конструктора, но, как раз к этой проблеме, как спроектировать, чтобы сделать это правильно?
Эта проблема доступна на месте:
смотри ass5
Благодарю.
Вам нужно добавить еще один конструктор:
AddExp(Expression* exp1, Expression* exp2) : TwoOpndExp(exp1, exp2) {}
Без этого TwoOpndExp
Конструктор не наследуется и поэтому недоступен.
Других решений пока нет …