Originariamente inviato da shodan
Non discuto le tue motivazioni: discuto il come lo fai.
Il problema non sono i 4 costruttori o le 3000 allocazioni: il punto è dove e come le fai.
Esempio:
codice:
Animali::Animali(const char N[], const float & e ) {
nome=new char[strlen(N)+1];
strcpy(nome,N);
eta=e;
}
Il costruttore base è questo.
Cane lo richiama attraverso il suo costruttore.
Ora se decidi di inserire un nuovo nome, che succede? Non perdi la memoria del vecchio puntatore?
La soluzione è di inserire il nome nel costruttore attraverso la
setNome() (ovviamente cambiando il prototipo). Stesso discorso per
setEta() e per tutte le classi derivate. Fai in modo di avere un singolo punto di allocazione, non tanti sparsi nelle funzioni. Così se qualcosa va storto sai dove andare a guardare.
codice:
Animali::Animali(const char N[], const float & e ) : nome(NULL), eta(0) {
setNome(N);
setEta(e);
}
//funzioni per nome
void setNome(const char N[]) {
if (nome == NULL) nome=new char[strlen(N)+1];
strcpy(nome,N);
}
void setEta(const float & e) { eta = e; }
In questo modo puoi creare tutti i costruttori che ti servono.
Tuttavia il punto da tenere presente è:
codice:
Animali::Animali(const char N[], const float & e ) :nome(NULL) , eta(0) {
vale a dire annullare tutti i puntatori nei costruttori, in modo che se non usati esplicitamente sia safe fare una delete su di loro.
Quindi tutti i costruttori (di tutte le classi) devono avere nella inizialization list, l'annullamento dei puntatori di loro competenza.
codice:
Cane (const char N[],const float & eta): Animali(N,eta), pelo(NULL), razza(NULL) {}
Per quanto riguarda l'input, la funzione da usare è:
codice:
cin.getline(N,19);
invece dopo un inserimento numerico è opportuno mettere:
codice:
cin.ignore(LONG_MAX,'\n');
in modo da evitare che il newline rimanga nel buffer, interferendo con l'input.