/* Purtroppo i vari C++ non sono tutti uguali, specialmente per quanto * riguarda le librerie di classi. Veniamo comunque alla pratica. * Una classe si dichiara in modo simile ad una struttura, e ha delle * aree di sicurezza per le sue variabili e funzioni: PRIVATE, quella a * cui si puo' accedere solo dalla classe stessa, PROTECTED, quella a cui * possono accedere anche le classi derivate, oltre alla propria, e PUBLIC, * che puo' essere raggiunta da tutte le funzioni del programma. * La sintassi generale di una dichiarazione di classe e' la seguente: * * class nome_classe { * dati e funzioni private * public: * dati e funzioni pubbliche * } eventuale lista oggetti da creare; * * Vediamo una classe minima: * * class animale { // Definisco la classe animale * int sonofattimiei; // Questa parte e' PRIVATE di default * public: // La parte che segue e' PUBLIC (visibile da tutti) * float lunghezza; // Nota: non si dovrebbero mai mettere delle * int numerozampe; // variabili in un area public. Non lo faremo piu' * }; * * Abbiamo anche introdotto il nuovo tipo di commento ad una sola linea, * che inizia dal // e termina alla fine della riga, senza bisogno di * richiuderlo, a differenza del vecchio che va richiuso. I due tipi di * commento si possono usare nello stesso listato scegliendo volta per volta * quale e' piu' opportuno. * Come si vede dal commento, non e' buona regola per la OOP mettere * variabili in area public, ossia renderle accessibili dall'esterno. * Ora possiamo dichiarare alcuni oggetti di tipo animale e usarli: * * animale cane1,cane2,gatto; // istanziamo 3 oggetti di tipo "animale". * * cane1.lunghezza = 30; // Accediamo alle variabili pubbliche * cane1.numerozampe = 4; // dell'oggetto da qualsiasi parte del prog. * * Come si nota, abbiamo usato l'operatore "." per dividere il nome * dell'oggetto dal nome della sua variabile, analogamente a come si fa * per le strutture. Da notare che ogni oggetto creato dalla classe astratta * "animale" e' indipendente, per cui scrivere in cane1.lunghezza non * modifica cane2.lunghezza, trattandosi di 2 oggetti fisicamente distinti: * il solo rapporto esistente tra cane1,cane2 e gatto e' che sono oggetti * dello stesso tipo. * Ora vedremo questo esempio, ma prima occorre introdurre CIN e COUT, le * nuove funzioni di Input/Output del C++, che si trovano in iostream.h. * Ecco un esempio del loro uso: * * #include <iostream.h> // Header necessario per usare CIN e COUT * // Questo e' un commento C++ ad una sola linea * int i; // Definisco una variabile intera * char str[80]; // Definisco una stringa * * main(void) * { * cout << "Introdurre un numero: "; // Stampa la frase come un printf() * cin >> i; // Legge il valore e lo copia in i come scanf() * cout << "Introdurre una stringa: "; * cin >> str; // Legge la stringa copiandola in str * * cout << "Il numero introdotto e': " << i << "\n"; * cout << "La stringa introdotta e': " << str << "\n"; * * } * * Come si puo' notare, con CIN e COUT si possono trattare allo stesso * modo stringhe, int, float, senza preoccuparci di specificare il tipo e * il numero di caratteri da stampare, a differenza di printf e scanf. * L'operatore << normalmente significa "scorrimento a sinistra dei bit", * ma quando e' usato in questo modo e' un operatore di output. * Lo stesso vale per >>, che e' lo scorrimento a destra, a parte questi * casi in cui indica l'input da tastiera. * Da notare che in C++ e' sempre possibile usare printf() e scanf(). * Ora siamo in grado di scrivere il primo programmino. */ #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 int sonofattimiei; // Questa parte e' PRIVATE di default public: // La parte che segue e' PUBLIC (visibile da tutti) float lunghezza; // Nota: non si dovrebbero mai mettere delle int numerozampe; // variabili in un area public. Non lo faremo piu' }; main(void) { // Ora possiamo dichiarare alcuni oggetti di tipo animale e usarli: animale cane1,cane2,millepiedi; // Ecco che istanzio 3 animali... // ossia creo 3 esemplari. cane1.numerozampe = 4; // Accediamo alle variabili pubbliche cane2.numerozampe = 4; // dell'oggetto analogamente a come millepiedi.numerozampe = 1000; // accediamo a dati delle strutture. // Richiediamo dati dall'utente. cout << "Lunghezza cane 1? "; // Stampa la frase come un printf() cin >> cane1.lunghezza; // Legge il valore come scanf() cout << "Lunghezza cane 2? "; // Stampa la frase come un printf() cin >> cane2.lunghezza; // Legge il valore come scanf() cout << "Lunghezza millepiedi? "; // Stampa la frase come un printf() cin >> millepiedi.lunghezza; // Legge il valore come scanf() cout << "Num. esatto piedi del millepiedi? "; // Stampa la frase. cin >> millepiedi.numerozampe; // Legge il valore come scanf() // Visualiziamo lo stato degli animali. cout << "\nStato del cane1: zampe = " << cane1.numerozampe; cout << ", lunghezza = " << cane1.lunghezza; cout << "\nStato del cane2: zampe = " << cane2.numerozampe; cout << ", lunghezza = " << cane2.lunghezza; cout << "\nStato del millepiedi: zampe = " << millepiedi.numerozampe; cout << ", lunghezza = " << millepiedi.lunghezza << "\n"; } /* Da notare che abbiamo agito su int e float senza fare distinzioni, usando * sempre CIN e COUT. In questo esempio abbiamo definito una variabile * "sonofattimiei", privata, che non e' stata usata, dato che la classe * non ha funzioni (metodi), gli unici che avrebbero potuto accederci. * Invece abbiamo scritto da "fuori" l'oggetto nelle due variabili pubbliche * "lunghezza" e "numerozampe". Non e' certo molto Object Oriented... * Cio' limita la classe ad una sorta di normale struttura, ed e' contrario * ai principi della OOP, in quanto si dovrebbero limitare, o evitare del * tutto variabili pubbliche, rendendo privati tutti i dati, controllandone * l'accesso mediante funzioni pubbliche. Piu' avanti avremo una maggiore * eleganza OOP. */