UnrealProject  forum
 
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Breve tutorial sui Distruttori in C++  (Letto 311 volte)
Prometheus
Nuovo arrivato
*
Scollegato Scollegato

Messaggi: 7


E-mail
« 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!
 


« Ultima modifica: 16 Dicembre 2009, 20:07:39 da Prometheus » Registrato
Cristian_c
Programmatore
Utente storico
*
Scollegato Scollegato

Messaggi: 1743


E-mail
« Risposta #1 inserito:: 16 Dicembre 2009, 20:25:48 »

Ottimo tutorial! 
Registrato

Jabber:cristian_cNOSPAMATjabberDOTorg (togliere 'nospam' e sostituire 'at' e 'dot' con i relativi simboli)
Citazione di: homer87
Io vado di dist-upgrade da una vita. Il vero nerd non formatta mai
Mr Kuzio
Amministratore
Utente storico
*****
Scollegato Scollegato

Messaggi: 952


Referente dei Grafici


WWW
« Risposta #2 inserito:: 16 Dicembre 2009, 21:46:57 »

Gran bel lavoro.

Non sono in grado di comprendere a pieno il tutorial (lo ammetto: l'ho letto di sfuggita), però apprezzo molto il tuo impegno e sopratutto la volontà di volerlo condividere con noi. 
Registrato

Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Powered by SMF | SMF © 2006-2008, Simple Machines LLC
Design By KryM
Pagina creata in 0.193 secondi con 18 query.