#ifndef __IZRAZI_HPP__
#define __IZRAZI_HPP__ 1

class Izraz {
public:
  virtual int vrednost() const = 0;
  virtual ~Izraz() {
    
  }
};

class Konstanta : public Izraz {
public:
  Konstanta(int vrednost)
    :_vrednost(vrednost)
  {}
  int vrednost() const {
    return _vrednost;
  }
private:
  int _vrednost;
};

class BinOp : public Izraz {
public:
  BinOp(Izraz *levi, Izraz *desni)
    :_levi(levi), _desni(desni)
  {}
  ~BinOp();
protected:
  Izraz* _levi;
  Izraz* _desni;
private:
  BinOp(const BinOp& z);
  BinOp& operator=(const BinOp& z);
};

class Zbir : public BinOp {
public:
  Zbir(Izraz *levi, Izraz *desni)
    :BinOp(levi, desni)
  {}
  int vrednost() const;
};

class Razlika : public BinOp {
public:
  Razlika(Izraz *levi, Izraz *desni)
    :BinOp(levi, desni)
  {}
  int vrednost() const;
};

class Proizvod : public BinOp {
public:
  Proizvod(Izraz *levi, Izraz *desni)
    :BinOp(levi, desni)
  {}
  int vrednost() const;
};

class Kolicnik : public BinOp {
public:
  Kolicnik(Izraz *levi, Izraz *desni)
    :BinOp(levi, desni)
  {}
  int vrednost() const;
};

class Mod : public BinOp {
public:
  Mod(Izraz *levi, Izraz *desni)
    :BinOp(levi, desni)
  {}
  int vrednost() const;
};


#endif

