/* Abbiamo visto come le classi siano una definizione astratta degli
* oggetti da istanziare, i quali poi avranno ognuno una copia personale
* sia dei metodi che delle variabili, per cui scrivendo in una variabile
* di un oggetto, non si cambia il valore delle copie di quella variabile
* negli altri oggetti istanza della stessa classe. Infatti se scriviamo
* in cane1.numerozampe non si modifica cane2.numerozampe, essendo queste
* due variabili indipendenti, e tra l'altro inaccessibili dall'esterno
* del proprio oggetto, essendo private.
* Pero' tale variabile si puo' definire statica, ossia si puo' fare in
* modo che tale variabile esista al massimo in una copia, anche se si
* istanziano svariati oggetti. In questo modo, tale variabile sara'
* condivisa da tutti gli oggetti istanziati dalla classe, e scrivere
* in essa da uno degli oggetti significhera' cambiarne il valore in tutti
* gli altri. Per dichiarare statica una variabile, basta usare "static":
*
* static int numerozampe;
*
* Vediamo il suo uso.
* NOTA: Questo sorgente presenta errori di link in compilazione, in quanto
* la classe dovrebbe essere compilata in un file oggetto .o a parte e
* linkata poi all'oggetto del main. Per semplicita' nei sorgenti C++ visti
* nel corso abbiamo messo tutto nello stesso sorgente, ma in questo caso
* si presenta (giustamente) un errore. Il nostro scopo e' quello di imparare
* il Java, d'altronde, per cui non ho voluto complicare ulteriormente le
* cose. Sappiate comunque che in Java vengono automaticamente creati dei
* file separati per le singole classi, anche se sono tutte nello stesso
* sorgente, e non occorre linkarle: si caricheranno da sole al momento
* dell'esecuzione.
* Potete trovare l'eseguibile nell'archivio CJAPCEXE.ZIP in linea sul sito
* www.anfitreatro.it, o potete ottenerlo se siete pratici di linkaggio.
*/
#include <iostream.h> // Header necessario per usare CIN e COUT
// Questo e' un commento C++ ad una sola linea
class animale { // Definisco la classe animale
static int numerozampe; // variabile STATICA e privata.
public: // La parte che segue e' PUBLIC
void mettizampe(int l); // Questi sono i prototipi delle funzioni
int leggizampe(void);
};
// Ora scriviamo le funzioni (metodi) della classe animale:
/*-------------------------------------------------------------------------*
* mettizampe: definisce il numero di zampe dell'animale.
* parametri: in entrata il num. di zampe in formato int.
*-------------------------------------------------------------------------*/
void animale::mettizampe(int l) // mettizampe() e' un metodo di animale
{
numerozampe = l; // Scrive il valore nella variabile privata "numerozampe".
}
/*-------------------------------------------------------------------------*
* leggizampe: legge e restituisce il num. di zampe dell'animale.
* parametri: in uscita il num. di zampe in formato int.
*-------------------------------------------------------------------------*/
int animale::leggizampe(void) // leggizampe() e' un metodo di animale
{
return numerozampe;
}
///////////////////////////////////////////////////////////////////////////
// Il main...
///////////////////////////////////////////////////////////////////////////
int main(void)
{
animale cane1,cane2; // Istanzio 2 oggetti della classe animale
// Azzeriamo usando i 2 mettizampe come se numerozampe non fosse static.
cane1.mettizampe(0); // Azzeriamo
cane2.mettizampe(0); // Non servirebbe, gia' azzerato prima.
// Scriviamo 40 in cane1.numerozampe
cane1.mettizampe(40); // In realta' abbiamo modificato anche cane2.
// Verifichiamo che la variabile, essendo static, e' una sola, condivisa,
// infatti sia cane1 che cane2 risulteranno avere 40 zampe.
cout << "\nStato dell'animale cane1: zampe = " << cane1.leggizampe();
cout << "\nStato dell'animale cane2: zampe = " << cane2.leggizampe();
return 0; // main() restituisce 0
}
/* Fate molta attenzione all'uso di static, perche' cambia molto la logica
* di funzionamento delle classi.
*/