Visualizza messaggio singolo
Vecchio 24-08-2009, 01.11.06   #1
leuconoe
Newbie
 
Registrato: 24-08-2009
Messaggi: 4
leuconoe promette bene
[C++]funzionamento costruttori di copia

Salve a tutti.
Sono nuova sia su questo forum che nel campo della programmazione
Volevo riportare qui di seguito una parte del progetto che sto compilando per l'università e chiedere qualche chiarimento che non è mai arrivato da parte del docente.

Codice:
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;

class indirizzo {
     
      char via[30];
      char numcivico[10];
      int cap;
      char citta[30];
      
       public:
      
             indirizzo();
             ~indirizzo();
            
             void put_via(char *s) {strcpy(via,s);}
             void get_via() {cout<<via<<'\n';}
             void put_numcivico (char *p) {strcpy(numcivico,p);}
             void get_numcivico() {cout<<numcivico<<'\n';}
             void put_cap(int n) {cap=n;}
             void get_cap() {cout<<cap<<'\n';}
             void put_citta(char *q) {strcpy(citta,q);}
             void get_citta() {cout<<citta<<'\n';}
      };
      
class CasaEditrice:public indirizzo  {
     
      char *nome;
      char *numtel;
      char *numfax;
      char *piva;
      char *id;
      
     
     public:
         friend ostream &operator<<(ostream &stream,  CasaEditrice &CasaEdi);
         friend istream &operator>>(istream &stream, CasaEditrice &CasaEdi);
             
             CasaEditrice(int p);
             CasaEditrice::CasaEditrice(const CasaEditrice &casaed);
             ~CasaEditrice();
             
             void put_nome(char *n) {nome=new char[strlen(n)+1]; strcpy(nome,n);}
             void get_nome() {cout<<nome<<'\n';}
             void put_numtel(char *n1) {numtel= new char[strlen(n1) +1]; strcpy(numtel,n1);}
             void get_numtel() {cout<<numtel<<'\n';} 
             void put_numfax (char *n2) { numfax= new char[strlen(n2)+1];strcpy(numfax,n2);}
             void get_numfax() {cout<<numfax<<'\n';}
             void put_piva(char *n3) {piva= new char[strlen(n3) +1];strcpy(piva,n3);}
             void get_piva() {cout<<piva<<'\n';}
             void put_id(char *n4) {id= new char[strlen(n4) +1];strcpy(piva,n4);}
             void get_iva() {cout<<piva<<'\n';}
             };
             


indirizzo::indirizzo()
{
       via[30]='\0';
       numcivico[10]='\0';
       cap=0;
       citta[30]='\0';                
                          
                           
}

indirizzo::~indirizzo()
{       if(via)          delete[] via;
        if(numcivico)    delete [] numcivico;
        
        if(citta)        delete[] citta;
} 


CasaEditrice::CasaEditrice(int p)
{
        nome=new char[p];                       
        numtel= new char[p]; 
        numfax= new char[p]; 
        piva= new char[p]; 
        id= new char[p]; 
        if((!nome)&&(!numtel)&&(!numfax)&&(!piva)&&(!id)) 
        {
            cout<<"impossibile allocare"; 
            exit(1);
        }
        
        *numtel=p;
        *numfax=p;
        *piva=p;
        *id=p;
}

CasaEditrice::CasaEditrice(const CasaEditrice &casaed)
{       nome=new char;                       
        numtel= new char; 
        numfax= new char; 
        piva= new char; 
        id= new char; 
        if((!nome)&&(!numtel)&&(!numfax)&&(!piva)&&(!id)) 
        {
            cout<<"impossibile allocare"; 
            exit(1);
        }
        *nome=*casaed.nome;
        *numtel=*casaed.numtel;
        *numfax=*casaed.numfax;
        *piva=*casaed.piva;
        *id=*casaed.id;
}        



CasaEditrice::~CasaEditrice()
{
        if(nome) delete[] nome;                     
        if(numtel) delete[] numtel;
        if(numfax) delete[] numfax;
        if(piva) delete[] piva;
        if (id) delete[] id;   
}



ostream &operator<<(ostream &stream,  CasaEditrice &CasaEdi )
{
        stream << CasaEdi.nome   << ". ";
        stream << CasaEdi.numtel << ". ";
        stream << CasaEdi.numfax << ". ";
        stream << CasaEdi.piva   << ". ";
        stream << CasaEdi.id     << "\n";
        return stream;
}


istream &operator>>(istream &stream,  CasaEditrice &CasaEdi )
{
        cout << "Inserire il nome: "; stream >> CasaEdi.nome;
        cout << "Inserire num. di tel: "; stream >> CasaEdi.numtel;
        cout << "Inserire num. di fax: "; stream >> CasaEdi.numfax;
        cout << "Inserire p.iva: "; stream >> CasaEdi.piva;
        cout << "Inserire id: "; stream >> CasaEdi.id;
       return stream;
} 

int main()
{   
    
        CasaEditrice bitti(45) ;
        cin>>bitti;
        cout<<Array;

   
   bitti.put_via("via alfieri 18");
   bitti.get_via();
    
     
    system ("PAUSE");
    return 0 ;
    
}
il programma funziona, ma non capisco se ho implementato correttamente il costruttore e il costruttore di copia.
poi, dal manuale, ho appreso che la deallocazione di un array statico non ha bisogno di istruzioni, quindi mi chiedevo se fosse corretto eliminare il distruttore per la classe indirizzo che utilizza l'istruzione delete[] per array di dimensione predefinita.
Vi sarei molto grati se mi chiarisse qualcosa soprattutto sui costruttori per array dinamici.
Scusate per la poca chiarezza del codice, ma, come ho già detto, la programmazione è cosa nuovissima per me.
Grazie a tutti
leuconoe non è collegato   Rispondi citando