PROGRAMMAZIONE AD OGGETTI 2001-2002
27-11-2001
Come visto nella lezione precedente, il primo passo da fare nella realizzazione di un programma ad oggetti è la suddivisione del problema in parti e risolvere ogni parte con una classe. E' molto più semplice trattare un problema complesso dopo averlo suddiviso in parti più piccole e indipendenti che possono interagire tra loro. Una volta individuate le parti in cui suddividere il problema si possono definire delle classi adatte ad interpretare ogni parte. Si possono quindi stabilire le relazioni tra le classi.
Per definire un oggetto basta utilizzare una classe già definita in precedenza (una classe diventa così uno stampo dal quale definire nuovi oggetti). Nel linguaggio C++ la classe può essere vista come un tipo, l'oggetto come una variabile definita del tipo classe. Le relazioni che ci sono tra le classi sono le stesse che ci sono tra gli oggetti definiti a partire dalle classi stesse. Ogni singolo oggetto è come una scatola la cui parte visibile è solo l'interfaccia esterna con cui comunica con gli altri oggetti: non è dato, e non serve, sapere cosa c'è dentro la scatola, cioè come è realizzato l'oggetto. Tutto ciò che si può vedere dell'oggetto è definito come public mentre tutto quello che non si vede è definito come private.
Gli attributi della classe modellano le caratteristiche fondamentali della classe stessa e degli oggetti definiti a partire da questa (il tipo di una variabile ne definisce le caratteristiche). Gli oggetti contengono al loro interno dei valori che corrispondono agli attributi della classe (il valore che può assumere una variabile è legato al tipo della variabile).
Come già detto i vari oggetti possono interagire tra loro tramite dei messaggi ai quali corrisponde come risposta l'attivazione di un metodo (i metodi possono essere visti come delle funzioni e quindi ad ogni messaggio corrisponde una chiamata a funzione).
Gli oggetti sono in associazione tra loro: possono comunicare tramite messaggi, possono essere parte di altri oggetti (aggregazione), hanno un certo ruolo nei confronti degli altri oggetti.... In C++ le associazioni sono definite con dei puntatori: un oggetto può "puntare" ad un altro oggetto e utilizzarne gli attributi o i metodi.
PROGRAMMAZIONE AD OGGETTI IN C++
In C++ le classi vengono utilizzate come dei nuovi tipi per definire variabili (oggetti). Per questo motivo la dichiarazione delle classi viene effettuata in un header file (file.h) che deve essere poi incluso in tutti i file di codice dove vengono definiti oggetti di quella classe. Nella dichiarazione della classe vi sono anche le dichiarazioni dei metodi degli oggetti (che non sono altro che funzioni).
Le funzioni deichiarate nelle classi del file header, vengono definite in un file .cpp.
Per ultimo si realizza il file .cpp che contiene il codice sorgente del programma e la funzione main. Questo file utilizza gli oggetti, definiti a partire dalle classi dichirate nel file header, e i loro metodi.
Una volta scritti i vari file è necessario renderli eseguibili utilizzando il compilatore g++. Il compilatore può compilare separatamente i vari file .cpp e poi "linkarli" in un momento successivo: fare il link significa includere nel file con il main gli altri file necessari epr l'esecuzione del programma (gli header files e i file contenenti le definizioni di funzioni, che devono essere compilati separatamente). Ecco i comandi per la compilazione:
g++ def.cpp -c prog.o
g++ main.cpp -c main.o
Queste istruzioni compilano i due file separatamente restituendo un file oggetto; per fare il link tra i file oggetto si usa il comando:
ld def.o main.o -o prog -lm
questo comando fa il link dei due file oggetto e degli header files e crea il file eseguibile prog.