sabato 1 dicembre 2012

Lavorare con i dati membro e Heap

E' possibile dichiarare i dati come puntatori il cui valore è immagazzinato su heap. Comunque i problemi possono nascere quando lo si utilizza in quanto bisogna comprendere il comportamento degli oggetti di default.

Presentare il programma dati membro Heap

Il programma definisce un nuovo tipo di roditore i cui dati membro sono dei puntatori, i quali puntano a oggetti immagazzinati su heap. La classe definisce alcune nuove funzioni membro che possono gestire la situazione nel quale un oggetto viene distrutto, copiato o assegnato ad un altro oggetto. Il programma distrugge, copia o assegna gli oggetti mostrando come essi si comportano, anche quando i dati membro puntano a valori conservati su heap. Il codice per il programma è il seguente:
 
// Dati membro su Heap
// Dimostra come un oggetto alloca dinamicamente i dati membro
 #include<iostrream>
 #include <string>
 using namespace std;
class Roditore
 {
    public:
              Roditore (const string& nome = “ ”) //costruttore
             { cout << “Chiamata al costruttore\n”;  m_pNome= new string(nome); }
   
             ~Roditore() //distruttore
            { cout << “Chiamata al distruttore\n”; delete m_pNome; }
   
             Roditore(const Roditore& c)
            { cout << “Copia costruttore”;
               m_pNome = new string;
              *m_pNome = c.DaiNome();       
              }
           Roditore& operator= (const Roditore& c)
          { cout << “Overload  operatore assegnazione”;
             if (this == &c) return *this;
            else {
                     m_pNome = new string;
                    *m_pNome = c.DaiNome();
                   }       
           }        

   string DaiNome() const { return *m_pNome; }
   void MettiNome( const string& nome =” ”){ *m_pNome = nome; }
   void DireCiao() const { cout << “Ciao, il mio nome e' ” << DaiNome() << endl; }
 private:
            string* m_pNome;
     };
 void testDistruttore();
 void testCopiaCostruttore (Roditore copia);
 void testAssegnaOp();
 

int main()
{
    testDistruttore();
    cout << endl;
    Roditore ctopo(“Topolino”);
    ctopo.DireCiao();
     testCopiaCostruttore(ctopo);
    cout << endl;
    testAssegnaOp();
    return 0;
    }
void testDistruttore()
 { Roditore ctopo(“Topp”);
   ctopo.DireCiao();
 }

void testCopiaCostruttore (Roditore copia);
{ copia.DireCiao(); }

void testAssegnaOp()
{ Roditore ctopo1(“topo1”);
   Roditore ctopo2(“topo2”);
  ctopo1 = ctopo2;
  ctopo1.DireCiao();
  ctopo2.DireCiao();
  cout << “Rimettere a topo1 il suo nome\n”;
  ctopo1.MettiNome(“topo1”);
  ctopo1.DireCiao();
  ctopo2.DireCiao();
  }

Nessun commento:

Posta un commento