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-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:
-
se richiamata dalla prendi (della classe luogo)
estrae un oggetto dal contenitore e ritorna il puntatore delloggetto
alla prendi.
-
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.
|