-
Notifications
You must be signed in to change notification settings - Fork 0
/
expression.cpp
68 lines (61 loc) · 3.24 KB
/
expression.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
* В этом задании вам предлагается разработать иерархию классов Expression
* для представления арифметических выражений. Конкретнее, вам нужно определить три класса:
* Expression — базовый класс иерархии,
* Number — для представления чисел и
* BinaryOperation — класс описывающий бинарную операцию (+, -, * или /).
*
* Класс Number должен хранить значение типа double.
* Класс BinaryOperation должен хранить указатель на левый и правый операнды,
* которые сами являются арифметическими выражениями,
* а также тип операции (+, -, * или /), которую нужно над ними произвести.
* Во всех классах должен быть метод evaluate, который возвращает значение типа double
* — значение соответствующего арифметического выражения, например, значение экземпляра
* типа Number — это число, которое он хранит, а если у вас есть объект BinaryOperation
* с операцией +, то нужно вычислить значения левого и правого операнда и вернуть их сумму.
* В данном задании вам нужно расставить ключевое слово virtual там, где это необходимо,
* определить метод evaluate там, где его не хватает, а также реализовать деструкторы,
* там где они нужны.
* При выполнении этого задания учтите, что при уничтожении объекта BinaryOperation
* он отвечает за уничтожение левого и правого операндов
* (гарантируется, что они выделены в динамической памяти).
*/
struct Expression
{
virtual ~Expression(){};
virtual double evaluate() const = 0;
};
struct Number : Expression
{
Number(double value) : value(value) {}
~Number(){};
double evaluate() { return value; }
virtual double evaluate() const { return value; }
private:
double value;
};
struct BinaryOperation : Expression
{
BinaryOperation(Expression const *left, char op, Expression const *right)
: left(left), op(op), right(right) {}
~BinaryOperation()
{
delete left;
delete right;
}
virtual double evaluate() const
{
if (op == '+')
return (left->evaluate() + right->evaluate());
else if (op == '-')
return (left->evaluate() - right->evaluate());
else if (op == '*')
return (left->evaluate() * right->evaluate());
else if (op == '/')
return (left->evaluate() / right->evaluate());
}
private:
Expression const *left;
Expression const *right;
char op;
};