Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //#include<iostream>
- //#include<memory>
- //#include<string>
- //
- //using namespace std;
- //
- ////Базовый класс арифметического выражения
- //class Expression
- //{
- //public:
- // virtual ~Expression() = default;
- // virtual int Evaluate() const = 0;
- // virtual string ToString() const = 0;
- //};
- //
- //using ExpressionPtr = unique_ptr<Expression>;
- //
- ////Класс, представляющий конкретное число - лист дерева выражения
- //
- //class ValueExpr: public Expression
- //{
- //public:
- // ValueExpr(int value) : value_(value) {}
- // int Evaluate() const override
- // {
- // return value_;
- // }
- // string ToString() const override
- // {
- // return to_string(value_);
- // }
- //private:
- // int value_;
- //};
- //
- //class BinaryExpr : public Expression
- //{
- //public:
- // BinaryExpr(ExpressionPtr left, ExpressionPtr right) :
- // left_(move(left)),
- // right_(move(right)) {}
- //
- // string ToString() const final
- // {
- // return '(' + left_->ToString() + ')'+
- // GetSymbol()+
- // '(' + right_->ToString() + ')';
- // }
- //
- // int Evaluate() const final
- // {
- // return EvaluateOnValues(left_->Evaluate(), right_->Evaluate());
- // }
- //
- //private:
- //
- // virtual char GetSymbol() const = 0;
- // virtual int EvaluateOnValues(int l, int r) const = 0;
- //
- // ExpressionPtr left_;
- // ExpressionPtr right_;
- //};
- //
- //
- //class ProductExpr : public BinaryExpr
- //{
- //public:
- // ProductExpr(ExpressionPtr left, ExpressionPtr right) :
- // BinaryExpr(move(left), move(right)) {}
- //private:
- // char GetSymbol() const override
- // {
- // return '*';
- // }
- // int EvaluateOnValues(int left, int right) const override
- // {
- // return left * right;
- // }
- //};
- //
- //class SumExpr : public BinaryExpr
- //{
- //public:
- // using BinaryExpr::BinaryExpr;
- //private:
- // char GetSymbol() const override
- // {
- // return '+';
- // }
- // int EvaluateOnValues(int left, int right) const override
- // {
- // return left + right;
- // }
- //
- //};
- //
- //ExpressionPtr Value(int value)
- //{
- // return make_unique<ValueExpr>(value);
- //}
- //
- //ExpressionPtr Sum(ExpressionPtr left, ExpressionPtr right)
- //{
- // return make_unique<SumExpr>(move(left), move(right));
- //}
- //
- //ExpressionPtr Product(ExpressionPtr left, ExpressionPtr right)
- //{
- // return make_unique<ProductExpr>(move(left), move(right));
- //}
- //
- //void Print(const Expression* e)
- //{
- // if (!e)
- // {
- // cout << "Null expression provided" << endl;
- // return;
- // }
- // cout << e->ToString() << " = " << e->Evaluate() << endl;
- //}
- //
- //int main()
- //{
- //
- // ExpressionPtr e1 = Product(Value(2), Sum(Value(3), Value(4)));
- // Print(e1.get());
- //
- // ExpressionPtr e2 = Sum(move(e1),Value(5));
- // Print(e2.get());
- //
- // Print(e1.get());
- //
- // return 0;
- //}
- #include<iostream>
- #include<memory>
- #include<string>
- using namespace std;
- //Базовый класс арифметического выражения
- class Expression
- {
- public:
- virtual ~Expression() = default;
- virtual int Evaluate() const = 0;
- virtual string ToString() const = 0;
- };
- using ExpressionPtr = shared_ptr<Expression>;
- //Класс, представляющий конкретное число - лист дерева выражения
- class ValueExpr : public Expression
- {
- public:
- ValueExpr(int value) : value_(value) {}
- int Evaluate() const override
- {
- return value_;
- }
- string ToString() const override
- {
- return to_string(value_);
- }
- private:
- int value_;
- };
- class BinaryExpr : public Expression
- {
- public:
- BinaryExpr(ExpressionPtr left, ExpressionPtr right) :
- left_(move(left)),
- right_(move(right)) {}
- string ToString() const final
- {
- return '(' + left_->ToString() + ')' +
- GetSymbol() +
- '(' + right_->ToString() + ')';
- }
- int Evaluate() const final
- {
- return EvaluateOnValues(left_->Evaluate(), right_->Evaluate());
- }
- private:
- virtual char GetSymbol() const = 0;
- virtual int EvaluateOnValues(int l, int r) const = 0;
- ExpressionPtr left_;
- ExpressionPtr right_;
- };
- class ProductExpr : public BinaryExpr
- {
- public:
- ProductExpr(ExpressionPtr left, ExpressionPtr right) :
- BinaryExpr(move(left), move(right)) {}
- private:
- char GetSymbol() const override
- {
- return '*';
- }
- int EvaluateOnValues(int left, int right) const override
- {
- return left * right;
- }
- };
- class SumExpr : public BinaryExpr
- {
- public:
- using BinaryExpr::BinaryExpr;
- private:
- char GetSymbol() const override
- {
- return '+';
- }
- int EvaluateOnValues(int left, int right) const override
- {
- return left + right;
- }
- };
- ExpressionPtr Value(int value)
- {
- return make_shared<ValueExpr>(value);
- }
- ExpressionPtr Sum(ExpressionPtr left, ExpressionPtr right)
- {
- return make_shared<SumExpr>(move(left), move(right));
- }
- ExpressionPtr Product(ExpressionPtr left, ExpressionPtr right)
- {
- return make_shared<ProductExpr>(move(left), move(right));
- }
- void Print(const Expression* e)
- {
- if (!e)
- {
- cout << "Null expression provided" << endl;
- return;
- }
- cout << e->ToString() << " = " << e->Evaluate() << endl;
- }
- int main()
- {
- ExpressionPtr e1 = Product(Value(2), Sum(Value(3), Value(4)));
- Print(e1.get());
- ExpressionPtr e2 = Sum(e1, Value(5));
- Print(e2.get());
- Print(e1.get());
- ExpressionPtr e3 = Sum(e1, e2);
- Print(e3.get());
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement