//Capo: capo.h
// Definisce: Capo, Cintura, Vestiario
#ifndef LISTC_H
#include "listc.h"
#endif
#ifndef ATTRLIST_H
#include "attrlist.h"
#endif
#ifndef CAPO_H
#define CAPO_H
class Vestiario; // Dichiarazione di classe
class Capo : public list<Capo> {
protected:
  void Pausa (int num);  // Metodo per interrompere lo scorrimento ogni 24 linee
  AttrGenere Genere;     // Attributi del generico capo
  AttrModello Modello;
public:
  /* Costruttore. Data la lista, il genere e il modello,
   * chiama gli opportuni costruttori per la superclasse e
   * gli attributi */ 
  Capo (TPtr &l, char *Gen, char *Mod) : list<Capo> (l), // Usando il template, non deve fare cast
    Genere (Gen), Modello (Mod) { };
  virtual int operator != (Capo *c);     // Operatore di confronto con una lista di capi
  virtual int operator == (AttrList *l); // Operatore di confronto con una richiesta
  virtual void show (int num);           // Funzione ricorsiva che mosatra l'intera lista
};

class Cintura : public Capo {
protected:
  AttrTaglia Taglia;  // Oltre agli attributi di un generico capo, una cintura ha la taglia
public:
  /* Costruttore. Dati la lista, il genere, il modello e la taglia,
   * chiama i costruttori con parametri per la superclasse e gli
   * attributi */
  Cintura (TPtr &l, char *Gen, char *Mod, int tg) :
    Capo (l, Gen, Mod), Taglia (tg) { };
  virtual int operator != (Capo *c);     // Operatore di confronto con un altro capo
  virtual int operator == (AttrList *l); // Operatore di confronto con una richiesta
  virtual void show (int num);           // Funzione ricorsiva che mosatra l'intera lista
};

class Vestiario : public Cintura {
  AttrColore Colore;  // Oltre agli attributi di una cintura, un capo di vestiario ha il colore
public:
  /* Costruttore. Dati la lista, il genere, il modello e la taglia, e il colore
   * chiama i costruttori con parametri per la superclasse e gli
   * attributi */
  Vestiario (TPtr &l, char *Gen, char *Mod, int tg, char *Col) :
    Cintura (l, Gen, Mod, tg), Colore (Col) { };
  virtual int operator != (Capo *c);     // Operatore di confronto con un altro capo
  virtual int operator == (AttrList *l); // Operatore di confronto con una richiesta
  virtual void show (int num);           // Funzione ricorsiva che mosatra l'intera lista
};
#endif