#ifndef NODO_H
#define NODO_H

#include <iostream>
#include <cstdlib>

using namespace std;

class Nodo {
     public:
        virtual int eval() const = 0;
        virtual ~Nodo() {};
};

class Cte : public Nodo {
    private:
       int val;

    public:
       Cte(int v= 0);
       virtual ~Cte();
       virtual int eval() const;
};

class Var : public Nodo {
    private:
       int* var;

    public:
       Var(int *v);
       virtual ~Var();
       virtual int eval() const;
};

class Chs : public Nodo {
   private:
       Nodo* der;
   public:
       Chs(Nodo* d);
       virtual ~Chs();
       virtual int eval() const;
};
 
class Sum : public Nodo {
    private:
       Nodo* izq;
       Nodo* der;
    public:
       Sum(Nodo* i, Nodo* d);
       virtual ~Sum();
       virtual int eval() const;
        
};

class Res : public Nodo {
    private:
       Nodo* izq;
       Nodo* der;
    public:
       Res(Nodo* i, Nodo* d);
       virtual ~Res();
       virtual int eval() const;
        
};

class Muls : public Nodo {
    private:
       Nodo* izq;
       Nodo* der;
    public:
       Muls(Nodo* i, Nodo* d);
       virtual ~Muls();
       virtual int eval() const;
        
};

class Divs : public Nodo {
    private:
       Nodo* izq;
       Nodo* der;
    public:
       Divs(Nodo* i, Nodo* d);
       virtual ~Divs();
       virtual int eval() const;
        
};

class Mods : public Nodo {
    private:
       Nodo* izq;
       Nodo* der;
    public:
       Mods(Nodo* i, Nodo* d);
       virtual ~Mods();
       virtual int eval() const;
        
};

class Expo : public Nodo {
    private:
       Nodo* izq;
       Nodo* der;
    public:
       Expo(Nodo* i, Nodo* d);
       virtual ~Expo();
       virtual int eval() const;
        
};

#endif
