#ifndef __IZRAZI_HPP__ #define __IZRAZI_HPP__ 1 #include using namespace std; class Izraz { public: virtual double vrednost() const = 0; virtual Izraz* kopija() const = 0; virtual ~Izraz(); }; class Konstanta : public Izraz { public: Konstanta(double x) :_v(x) {} double vrednost() const; Izraz* kopija() const; private: double _v; }; class BinOp : public Izraz { public: BinOp(Izraz *i1, Izraz *i2) :_levi(i1), _desni(i2) {} ~BinOp(); BinOp(const BinOp& z); BinOp& operator=(const BinOp &z); protected: Izraz *_levi; Izraz *_desni; }; class UnOp : public Izraz { public: UnOp(Izraz *i) :_arg(i) {} ~UnOp(); UnOp(const UnOp& z); UnOp& operator=(const UnOp &z); protected: Izraz *_arg; }; class Zbir : public BinOp { public: Zbir(Izraz *i1, Izraz *i2) :BinOp(i1, i2) {} double vrednost() const; Izraz* kopija() const; }; class Razlika : public BinOp { public: Razlika(Izraz *i1, Izraz *i2) :BinOp(i1, i2) {} double vrednost() const; Izraz* kopija() const; }; class Proizvod : public BinOp { public: Proizvod(Izraz *i1, Izraz *i2) :BinOp(i1, i2) {} double vrednost() const; Izraz* kopija() const; }; class Kolicnik : public BinOp { public: Kolicnik(Izraz *i1, Izraz *i2) :BinOp(i1, i2) {} double vrednost() const; Izraz* kopija() const; }; class Minus : public UnOp { public: Minus(Izraz *i) :UnOp(i) {} double vrednost() const; Izraz* kopija() const; }; class Promenljiva : public Izraz { public: Promenljiva(string s) :_ime(s) {} double vrednost() const; Izraz* kopija() const; private: string _ime; }; #endif