Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di pasKuz
    Registrato dal
    Jun 2004
    Messaggi
    687

    [C++] costruttori e distruttori classi e struct

    ciao a tutti. ho una classe persona in cui c'è un elemento indirizzo, che è una struttura a parte.

    la struct indirizzo è
    codice:
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    struct indirizzo {
    	char *via;
    	char *paese;
    	int cap;
    	indirizzo(char*vi,char*paes,int ca);
    	indirizzo(const indirizzo &obj);
    	~indirizzo();
    };
    
    indirizzo::indirizzo(char*vi,char*paes,int ca) {
    	via=new char[strlen(vi)+1];
    	if(!via)
    		exit(1);
    	strcpy(via,vi);
    	paese=new char[strlen(paes)+1];
    	if(!paese)
    		exit(1);
    	strcpy(paese,paes);
    	cap=ca;
    }
    
    indirizzo::indirizzo(const indirizzo &obj) {
    	via=new char[strlen(obj.via)+1];
    	if(!via)
    		exit(1);
    	strcpy(via,obj.via);
    	paese=new char[strlen(obj.paese)+1];
    	if(!paese)
    		exit(1);
    	strcpy(paese,obj.paese);
    	cap=obj.cap;
    }
    
    indirizzo::~indirizzo() {
    	if(via)
    		delete [] via;
    	if(paese)
    		delete [] paese;
    }
    mentre la class persona è
    codice:
    class persona {
    	char *nome;
    	char *cognome;
    	indirizzo i;
    public:
    	persona(char*nom,char*cognom,char*vi,char*paes,int ca);
    	persona(const persona &obj);
    	~persona();
    };
    
    persona::persona(char*nom,char*cognom,char*vi,char*paes,int ca) {
    	nome=new char[strlen(nom)+1];
    	if(!nome)
    		exit(1);
    	strcpy(nome,nom);
    	cognome=new char[strlen(cognom)+1];
    	if(!cognome)
    		exit(1);
    	strcpy(cognome,cognom);
    }
    
    persona::persona(const persona &obj) {
    	nome=new char[strlen(obj.nome)+1];
    	if(!nome)
    		exit(1);
    	strcpy(nome,obj.nome);
    	cognome=new char[strlen(obj.cognome)+1];
    	if(!cognome)
    		exit(1);
    	strcpy(cognome,obj.cognome);
    	
    	i.via=new char[strlen(obj.i.via)+1];
    	if(!i.via)
    		exit(1);
    	strcpy(i.via,obj.i.via);
    	i.paese=new char[strlen(obj.i.paese)+1];
    	if(!i.paese)
    		exit(1);
    	strcpy(i.paese,obj.i.paese);
    	i.cap=obj.i.cap;
    }
    
    persona::~persona() {
    	if(nome)
    		delete [] nome;
    	if(cognome)
    		delete [] cognome;
    }
    mi chiedo: come fare passare i parametri al costruttore di indirizzo?
    inoltre, nel costruttore di copia di persona faccio bene ad accedere ai dati di indirizzo direttamente con i.via, o è necessario sperificare nell'intestazione qualcosa tipo :i(via,paese,cap)?
    e nel distruttore di persona come faccio partire il distruttore di indirizzo?

    grazie..ciao

  2. #2
    Utente di HTML.it L'avatar di pasKuz
    Registrato dal
    Jun 2004
    Messaggi
    687
    ho risolto andando a togliere le funzioni pubbliche della struct indirizzo, e lasciando la costruzione e distruzione solo alle funzioni della class persona, poichè la struct non la utilizzerò da sola, ma solo all'interno di persona, fatto bene?

  3. #3
    Ciao,
    per me la strada di chiamare il costruttore di indirizzo (come da te indicato) nella lista di inizializzazione di persona è la strada più pulita; inoltre ho notato l'uso di exit(1) se per caso falliscono le new...io al tuo posto userei le eccezioni...sono più pulite...e userei le eccezioni anche per controllare che i puntatori passati al costruttore siano validi, personalmente diffido da chiunque compreso me stesso nel passare sempre e solo puntatori validi alle funzioni
    Se poi indirizzo la usi solo all'interno di persona perchè non la dichiari nella persona stessa come classe annidata ?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.