Prometheus
Nuovo arrivato
Scollegato
Messaggi: 7
|
 |
« inserito:: 16 Dicembre 2009, 20:03:58 » |
|
Salve a tutti. Vorrei proporre alla vostra attenzione questo breve tutorial sulle classi in C++ ponendo particolare attenzione all'istanziamento di un oggetto e la chiamata del suo distruttore. Innanzitutto partiamo col dire che vi sono due modi per istanziare un oggetto in C++. Il primo metodo prevede di istanziare l'oggetto nello stack della memoria, in questo modo la chiamata del distruttore è implicita, ovvero l'oggetto verrà distrutto al termine dell'applicazione o al termine della funzione che ha istanziato l'oggetto. Il secondo metodo detto "allocazione dinamica della memoria", prevede l'utilizzo della parola d'ordine (o keyword) "new" e istanzierà l'oggetto nell'heap della memoria. Il secondo metodo impone che sia il programmatore a chiamare esplicitamente il distruttore poichè al termine dell'applicazione o della funzione che ha istanziato l'oggetto, l'oggetto sarà ancora in memoria (mai sentito parlare del terrificante errore di "memory leak"? Ecco, detta in soldoni, questo errore si verifica quando riempiamo la nostra memoria di oggettini senza preoccuparci di distruggerli nel momento in cui non servono più. Prima o poi la nostra memoria si riempirà del tutto scatenando il terrificante memory leak error!)
Ma passiamo all'aspetto pratico! Ecco un semplice esempio di classe:
#include <iostream>
using namespace std;
class CPlayer { private: int HP, MP; char *name;
public:
CPlayer() { HP = 0; MP = 0; name = ""; }
CPlayer(int a, int b, char *name) : HP(a), MP(b), name(name) {
}
CPlayer(const CPlayer &player) { HP = player.HP; MP = player.MP; name = player.name; }
~CPlayer() { cout<<"Destructor called!"<<endl; }
void display() { cout<<HP<<endl; cout<<MP<<endl; cout<<name<<endl; } };
Presumendo che abbiate un minimo di esperienza nelle classi in C++, dovrebbe aver attirato la vostra attenzione la definizione del distruttore della classe CPlayer. In pratica quando il distruttore verrà chiamato (implicitamente o esplicitamente), esso ci avviserà della sua chiamata stampando "Destructor called!". Questo per rendere visibile (e spero più semplice da capire) la chiamata al distruttore. Creiamo ora un semplice main in cui istanziare la nostra classe:
int main() { CPlayer *player = new CPlayer(33,44,"Ihsahn"); player->display();
delete player;
cin.get(); return 0; }
CPlayer *player = new CPlayer(33,44,"Ihsahn"); Per prima cosa abbiamo istanziato il nostro oggetto della classe CPlayer usando il secondo metodo utilizzando la keyword new.
delete player; Al termine del nostro main l'oggetto puntato dal puntatore player rimarrà in memoria per cui, da buoni programmatori di C++ quali siamo, ci preoccuperemo di chiamare esplicititamente il nostro distruttore prima del termine della funzione main. Il risultato sarà il seguente:
33 44 Ihsan Destructor called!
Dove la linea stampata "Destructor called!" ci assicurerà che il nostro distruttore è stato chiamato e la memoria liberata. Aggiungiamo ora una semplice funzione chiamata "CreatePlayer" per testare il primo metodo di istanziamento degli oggetti:
void CreatePlayer() { CPlayer player(22,33,"Gumpy"); player2.display(); }
int main() { CPlayer *player1 = new CPlayer(33,44,"Ihsahn"); player->display();
delete player;
CreatePlayer();
cin.get(); return 0; }
La funzione CreatePlayer() si preoccupa di istanziare l'oggetto utilizzando il primo metodo quindi noi ci aspettiamo che al termine della funzione CreatePlayer() il distruttore della classe CPlayer venga chiamato implicitamente. Nel main infatti viene chiamata solo la funzione CreatePlayer() e non la keyword delete che distrugge l'oggetto istanziato in CreatePlayer(). Se andremo ad eseguire nuovamente il nostro programma otterremo:
33 44 Ihsahn Destructor called! 22 33 Gumpy Destructor called!
Come potete vedere, la seconda volta che viene stampato "Destructor called!" veniamo informati che il distruttore è stato chiamato implicitamente al termine della funzione CreatePlayer(). Spero che questo breve tutorial vi sia stato d'aiuto. In attesa di critiche e suggerimenti vi rimando alla prossima!
|