#pragma once

/**
 * Абстрактное выражение или просто Выражение.
 *
 * Базовый класс, реализующий идею деревьев абстрактных выражений (abstract expression trees), применяемых в отложенных вычислениях (lazy evaluation).
 */
class Expression
{
protected:
	/// вычисленное значение
	double _value;
	
	/// значение вычислено?
	bool _isEvaluated;
	
	/**
	 * Конструктор.
	 *
	 * @param isEvaluated значение вычислено?
	 */
	Expression();

	/**
	 * Конструктор, используемый для формирования выражения-константы.
	 *
	 * @param value значение
	 */
	Expression(double value);
public:
	/**
	 * Функция, проверяющая вычислено ли выражение, при необходимости инициирующая вычисление.
	 *
	 * @return вычисленное выражение
	 */
	double value(); 

	/**
	 * Деструктор.
	 */
	virtual ~Expression();

	/**
	 * Функция, вычисляющая выражение.
     *
	 * Перегружается в наследниках.
	 *
	 * @return вычисленное выражение
	 */
	virtual double eval() = 0;

};
