Gli Oggetti

Quando parliamo di oggetti ci riferiamo in realt alla classe base di una gerarchia che comprende anche le classi derivate Oggetto Ostruzione, Oggetto Contenitore e Oggetto Nascondiglio. Queste classi ereditano molti metodi della classe base e differiscono solo per alcune funzioni che le caratterizzano in modo particolare e sono quindi appositamente ridefinite (es. apri per gli oggetti contenitori, sposta per gli oggetti nascondiglio). La scelta della derivazione si rivelata efficace per la gestione di quegli oggetti le cui propriet richiedevano una gestione pi complessa (oggetti contenitori, nascondiglio e ostruzione) mentre altri oggetti sono stati individuati nella classe base mediante alcuni booleani settati a true (es. oggetti illuminabili che hanno il campo bool illuminabile=true)

 



Oggetto

 


            


Oggetto-Contenitore

 


Oggetto-Ostruzione
 


Oggetto-Nascondiglio
 

Passiamo ora ad esaminare le classi partendo dalla classe base Oggetto.
 

Classe Oggetto

Classe Oggetto

protected:
      friend fstream& operator>>(fstream& s, oggetto* &a);
      static int CodOgg;
      int idogg;
      string nomeogg;
      string desogg;
      bool illuminabile;
      bool acceso;
      bool trasportabile;
      bool spostabile;
      bool apribile;
      bool cnt;
      string suggest;
      string reagente;
public:
      oggetto(string n, string d, bool i, bool t, bool s, bool a, bool ac, string sugg, string r);
      virtual ~oggetto();
      string nome()const;
      string descrizione()const;
      int id()const;
      bool prendi()const;
      bool lux()const;
      bool contenitore()const;
      bool sugg()const;
      string prntsugg()const;
      virtual oggetto* estrai(string& ogg, string& tipo);
      void deletesugg();
      void virtual guarda();
      virtual luogo* sposta(luogo* &utente, string& ogg);
      virtual luogo* usa(luogo* &utente, string& ogg);
      virtual luogo* apri(luogo* &utente, string& ogg);
      void accendi(string& ogg);
      void spegni();
      virtual int salva(fstream& uscita);    

 

Analogamente alla struttura del campo protetto della classe Luogo, troviamo nella classe Oggetto la ridefinizione delloperatore >> (fstream& operator>>) e le variabili intere idogg (int idogg) e CodOgg (static int CodOgg) per contraddistinguere gli oggetti alla loro creazione. Anche le stringhe nomeogg (string nomeogg), desogg (string desogg) e suggest (string suggest) svolgono le medesime funzione delle rispettive analoghe in Luogo. La stringa reagente (string reagente), indica il nome delloggetto che interagisce con loggetto della classe in metodi quali usa ..conoppure accendicon etc
Infine nel campo protetto troviamo sei variabili booleane; cinque di queste rappresentano altrettante diverse possibili propriet delloggetto: illuminabile (bool illuminabile), trasportabile (bool trasportabile), spostabile (bool spostabile), apribile (bool apribile), contenitore (bool cnt). Lunica rimasta (bool acceso) indica, nel caso loggetto sia illuminabile (illuminabile=true), se questo acceso o spento.


METODI

tralasciando il funzionamento banale di costruttore e distruttore e quello altrettanto ovvio di tutte quelle funzioni che ritornano il valore delle variabili protette (string nome() const, string descrizione ()const, int id () const, bool prendi() const, bool lux() const, bool contenitore() const, bool sugg() const, string prntsugg() const ) passiamo a esaminare le rimanenti funzioni inline presenti nella dichiarazione della classe. Con il metodo deletesugg (void deletesugg() ) viene cancellata leventuale stringa suggest. La funzione estrai ( virtual oggetto* estrai (string& ogg, string& tipo), dichiarata virtual in quanto deve essere chiamata anche sugli oggetti delle sottoclassi, ritorna il puntatore NULL in quanto non svolge operazioni significative per gli oggetti della superclasse.

La guarda (void virtual guarda ()) stampa a  video il nome e la descrizione delloggetto; la usa (virtual luogo* usa (luogo*& utente, string& ogg)), invece, controlla se loggetto illuminabile e in caso richiama la funzione accendi. Il metodo sposta (virtual luogo* sposta(luogo* &utente, string& ogg)) controlla se loggetto spostabile, controlla il reagente (caso sposta obj con obj) e se sono uguali (o entrambi nulli) stampa a video un messaggio che informa lutente dello spostamento delloggetto, altrimenti stampa un messaggio di errore. Identico il funzionamento della apri (virtual luogo*apri (luogo*& utente, string& ogg)).La funzione accendi (void accendi (string& ogg)) controlla il valore della variabile reagente e lo confronta con la stringa ogg passata come argomento. Se questi sono uguali (o  entrambi nulli), loggetto viene acceso. La spegni, che non   direttamente richiamabile dallutente, (void spegni()), definita inline, spegne automaticamente un oggetto trasportabile e acceso che viene messo in uno zaino, settando a false il valore di acceso.

Le funzioni salva (virtual int salva (fstream& uscita)) e la ridefinizione dalloperatore >> (friend fstream&  operator>> (fstream& s, oggostr* & a)) svolgono operazioni simili in tutte le classi della gerarchia quindi verranno trattate in un unico paragrafo (vedi SALVA e OPERATORE >> a fine pagina).

 

Oggetto Ostruzione

Classe Oggetto-Ostruzione

protected:
      string direzione;
       bool stato;
       friend fstream& operator>>(fstream& s, oggostr* &a);
public:
       oggostr(string n, string d, bool i, bool t, bool s, bool a, bool ac, string sugg, string r, string dir, bool aperto):oggetto(n, d, i, t, s, a, ac, sugg, r);
      ~oggostr();
      virtual luogo* usa(luogo* &utente, string& ogg);
      virtual luogo* apri(luogo* &utente, string& ogg);
      virtual int salva(fstream& uscita);  
   

La classe oggostr una sottoclasse di Oggetto e in quanto tale eredita il campo dati della classe base. Lampliamento della campo protetto riguarda solo lallocazione di una stringa direzione (string direzione) che localizza la direzione dellostruzione e di un booleano stato (bool stato) che controlla lo stato dellostruzione. Loperatore >> stato ridefinito opportunamente.

 
METODI

Il costruttore della classe Oggostr  opera attraverso la lista di inizializzazione; sempre secondo le regole di derivazione avviene la distruzione degli oggetti creati.

Nel campo public sono presenti quelle funzioni ereditare dalla classe base per le quali occorre una ridefinizione. La funzione usa (virtual luogo* usa(luogo*& utente, string& ogg)) controlla se il valore del reagente uguale al valore di ogg. In caso affermativo avviene una chiamata alla funzione delostr() che elimina lostruzione. La usa viene invocata quando lutente scrive comandi del tipo usacon

La apri (virtual luogo* apri(luogo*& utente, string& ogg)) ridefinita per gestire loggetto porta, che per semplicit abbiamo gestito come unostruzione. In questo modo la porta risulta inizialmente chiusa (perch blocca il passaggio alla stanza successiva) ed possibile aprirla sia con che senza altri oggetti grazie ad un controllo sul valore del reagente. La variabile stato delloggetto ostruttore stata implementata appositamente per memorizzare lo stato aperto/chiuso di una porta oggetti simili (es. portone).

 

Oggetto Contenitore

Classe Oggetto-Contenitore

protected:
      map<string,oggetto*> cont;
      friend fstream& operator>>(fstream& s, oggcont*       &a);
      bool stato;
public:
      oggcont(string n, string d, bool i, bool t, bool s, bool a, bool ac, string sugg, string r, bool st):oggetto(n, d, i, t, s, a, ac, sugg, r);
      ~oggcont();
      oggcont& operator+=(oggetto& ogg);
      virtual oggetto* estrai(string& ogg, string& tipo);
      bool search(string ogg);
      virtual luogo* apri(luogo* &utente, string& ogg);
      void virtual guarda();
      virtual luogo* usa(luogo* &utente, string& ogg);
      virtual int salva(fstream& uscita);
      virtual void salvazaino(fstream& uscita);
 

Come per gli oggetti ostruttore, nel campo protetto della classe oggcont viene utilizzata la variabile aggiuntiva stato che memorizza lo stato aperto/chiuso delloggetto contenitore, ma ci che caratterizza gli oggetti contenitore la presenza di una mappa di oggetti contenuti (map<string, oggetto*> cont). Questa struttura consente di poter gestire anche pi oggetti allinterno di un contenitore.


METODI

Oltre al costruttore e al distruttore, nella classe oggcont troviamo una nuova funzione che search (bool search (string ogg)). Questa effettua una ricerca allinterno della mappa e se viene trovato loggetto ogg passato come argomento, restituisce true.
La ridefinizione delloperatore += (oggcont& operator += (oggetto& ogg)) permette linserimento delloggetto nelloggetto contenitore  attraverso la funzione insert definita sulle mappe nella STL.

Le funzioni ereditate dalla classe Oggetto e ridefinite per un corretto funzionamento sono tre:
usa ( virtual luogo*usa (luogo*& utente, string& ogg)), che effettua una chiamata alla funzione apri; apri (virtual luogo*apri  (luogo*& utente, string& ogg)), che attraverso il controllo sul reagente apre il contenitore; guarda (void virtual guarda()) che stampa il nome e la descrizione del contenitore e, se questo aperto, anche la lista degli oggetti contenuti; estrai ( virtual oggetto* estrai (string& ogg, string& tipo)) che:

  1. se richiamata dalla prendi (della classe luogo) estrae un oggetto dal contenitore e ritorna il puntatore delloggetto alla prendi.

  2. che se richiamata dalla lascia (della classe luogo) estrae loggetto dal contenitore zaino e ritorna il puntatore delloggetto alla lascia.

La differenza, tra le due operazioni, nelloutput mostrato al giocatore che stato opportunamente personalizzato per i due casi. La gestione delloggetto ritornato dallestrai lasciato rispettivamente alla funzione chiamante.

Lo zaino, oggetto contenitore anchesso, ha una propria funzione salva (virtual void salvazaino (fstream& uscita)), creata opportunamente per salvare solo gli oggetti contenuti in esso e non le sue propriet, come avviene per gli altri oggetti. Questo perch lo zaino e le sue propriet sono inizializzate di default dalla classe ambiente.

 

Oggetto Nascondiglio

Classe Oggetto-Nascondiglio

protected:
       map<string,oggetto*> nascondiglio;
       friend fstream& operator>>(fstream& s, oggnasc* &a);
public:
       oggnasc(string n, string d, bool i, bool t, bool s, bool a, bool ac, string sugg, string r):oggetto(n, d, i, t, s, a, ac, sugg, r);
       oggnasc& operator*=(oggetto &ogg);
       ~oggnasc();
       void virtual sposta(luogo &utente);
       virtual luogo* usa(luogo* &utente, string& ogg);
       virtual int salva(fstream& uscita);
      

Limplementazione degli oggetti nascondiglio la stessa degli oggetti contenitore; questa volta la mappa non una mappa di oggetti contenuti, bens di oggetti nascosti (map<string, oggetto*> nascondiglio) e manca il booleano stato perch i nascondigli sono stati intesi come oggetti non apribili.


METODI

Loperatore * = (oggnasc& operator *= (oggetto& ogg)) lanalogo del += ridefinito negli oggetti contenitore.

Il metodo sposta (void virtual sposta (luogo& utente)), dopo il controllo sul booleano spostabile, inserisce gli oggetti nascosti nella mappa di oggetti in Luogo attraverso loperatore += definito in questultimo e li toglie dalla mappa deloggetto nascondiglio. Inoltre stampa a video la nuova lista degli oggetti nel Luogo.

Infine la funzione usa (virtual luogo* usa (luogo*& utente, string& ogg)) controlla il valore del reagente e se corrisponde al valore di ogg, estrae gli oggetti nascosti nella mappa del nascondiglio e li inserisce nel luogo.


SALVA

La salva (virtual int salva (fstream &uscita)) scrive sul file world.ini tutte le propriet delloggetto.
Queste vengono inserite nelle voci comprese tra i separatori  che lo identificano (es. [Oggetto] e [EndOggetto] oppure[OggContenitore] e [EndOggContenitore] etc... ).
La salva di Oggetto chiamata in maniera virtuale dalla salva di Luogo, che a sua volta chiamata dalla salva di Ambiente.

OPERATORE  FStrEAM>>

Come per la classe Luogo, loperatore >> ridefinito per leggere le singole righe da file e, utilizzando la research, assegnare i valori right alle variabili che verranno utilizzate come parametri per la creazione dinamica degli oggetti.