Загрузка данных


class Expression {
public:
    virtual int Evaluate() const = 0;
    virtual std::string ToString() const = 0;
    virtual ~Expression() {}
};

using ExpressionPtr = std::shared_ptr<Expression>;

class Const_ : public Expression {
public:
    Const_(int v) {
        val = v;
    }
    int Evaluate() const override {
        return val;
    }
    std::string ToString() const override {
        return std::to_string(val);
    }
private:
    int val;
};

class Sum_ : public Expression {
public:
    Sum_(ExpressionPtr l, ExpressionPtr r) {
        left = l;
        right = r;
    }
    int Evaluate() const override {
        return left->Evaluate() + right->Evaluate();
    }
    std::string ToString() const override {
        return left->ToString() + " + " + right->ToString();
    }
private:
    ExpressionPtr left;
    ExpressionPtr right;
};

class Product_ : public Expression {
public:
    Product_(ExpressionPtr l, ExpressionPtr r) {
        left = l;
        right = r;
    }
    int Evaluate() const override {
        return left->Evaluate() * right->Evaluate();
    }
    std::string ToString() const override {
        return left->ToString() + " * " + right->ToString();
    }
private:
    ExpressionPtr left;
    ExpressionPtr right;
};

ExpressionPtr Const(int value) {
    return std::make_shared<Const_>(value);
}

ExpressionPtr Sum(ExpressionPtr a, ExpressionPtr b) {
    return std::make_shared<Sum_>(a, b);
}

ExpressionPtr Product(ExpressionPtr a, ExpressionPtr b) {
    return std::make_shared<Product_>(a, b);
}