#include #include #include using namespace std; map tablica; class Izraz { public: virtual double vrednost() const = 0; virtual ~Izraz() { } virtual Izraz* kopija() const = 0; }; class Konstanta : public Izraz { public: Konstanta(double v) :_v(v) {} double vrednost() const { return _v; } Izraz* kopija() const { return new Konstanta(*this); } private: double _v; }; class Promenljiva : public Izraz { public: Promenljiva(string s) :_s(s) {} double vrednost() const { return tablica[_s]; } Izraz* kopija() const { return new Promenljiva(*this); } private: string _s; }; class BinOp : public Izraz { public: BinOp(Izraz *levi, Izraz *desni) :_levi(levi->kopija()), _desni(desni->kopija()) {} ~BinOp() { delete _levi; delete _desni; } BinOp(const BinOp& z) { _levi = z._levi->kopija(); _desni = z._desni->kopija(); } BinOp& operator=(const BinOp& z) { if (this != &z) { delete _levi; delete _desni; _levi = z._levi->kopija(); _desni = z._desni->kopija(); } return *this; } protected: Izraz *_levi, *_desni; }; class Zbir : public BinOp { public: Zbir(Izraz *levi, Izraz *desni) :BinOp(levi, desni) {} double vrednost() const { return _levi->vrednost() + _desni->vrednost(); } Izraz* kopija() const { return new Zbir(*this); } }; class Proizvod : public BinOp { public: Proizvod(Izraz *levi, Izraz *desni) :BinOp(levi, desni) {} double vrednost() const { return _levi->vrednost() * _desni->vrednost(); } Izraz* kopija() const { return new Proizvod(*this); } }; int main() { tablica["x"] = 5; Izraz* i1 = new Konstanta(2); //cout << "i1 = " << i1->vrednost() << endl; Izraz* i2 = new Konstanta(3); //cout << "i2 = " << i2->vrednost() << endl; Izraz* i3 = new Promenljiva("x"); //cout << "i3 = " << i3->vrednost() << endl; Izraz* i4 = new Proizvod(i2, i3); //cout << "i4 = " << i4->vrednost() << endl; Izraz* i5 = new Zbir(i1, i4); cout << "i5 = " << i5->vrednost() << endl; delete i1; delete i2; delete i3; delete i4; delete i5; return 0; }