Представляет вычисление выражения 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 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);

Я знаю, что класс будет содержать что-то в виде списка параметров для поиска правильного конструктора, но, как раз к этой проблеме, как спроектировать, чтобы сделать это правильно?

Эта проблема доступна на месте:

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 / задания /

смотри ass5

Благодарю.

0

Решение

Вам нужно добавить еще один конструктор:

AddExp(Expression* exp1, Expression* exp2) : TwoOpndExp(exp1, exp2) {}

Без этого TwoOpndExp Конструктор не наследуется и поэтому недоступен.

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector