Newsgroup: it.comp.lang.c++
Titolo: .CPP vs H. e altro

Ciao a tutti!
Scusatemi per le solite domande banali, spero siano le ultime:
1) Scaricando esempi da Interenet, ho visto che in certi casi
l'implementazione di alcuni metodi è inserita direttamente nel file .H, in
altri è riportata nel .CPP. Quand'è che conviene scrivere il codice di un
metodo direttamente nell'header della classe, e quando è meglio inserirlo
nel file CPP?
2) Se ho una classe con una variabile privata come la seguente
float v[10];
Devo distruggerla nel distruttore con delete[] anche se non faccio alcuna
new?
Come sempre, grazie in anticipo.
Riccardo

 new?
Devi distruggere solo la roba allocata con new, new[], malloc e in generale
la roba "inizializzata" con funzioni "esterne" (se apri un file nel
costruttore lo devi chiudere nel distruttore). Se per esempio avevi
FILE *v[10]; (un array di files C) allora se erano aperti li dovevi
chiudere. Tu hai un array di float... Non c'è molto da ripulire :-)
--- bye

nel file CPP?
Se tu inserisci un metodo "inline" in una classe (così:
class A
{
    int miometodo1()
    {
        return 1;
    }
}
) allora è considerato essere inline (quindi il compilatore se vuole potrà
"far sparire" il metodo e inserire direttamente il codice dove lo vuole).
Se tu invece fai così:
// questo va nell'header
class A
{
    inline int miometodo1();
}
// questo va nell'header
inline int A::miometodo1()
{
    return 1;
}
questo è equivalente al precedente.
// questo va nell'header
class A
{
    int miometodo1();
}
// questo dove vuoi (ma attenzione se lo inserisci in un header) **
int A::miometodo1()
{
    return 1;
}
allora il metodo NON è inline.
(**) c'è un problema: se tu hai due files in cui c'è il corpo DELLA STESSA
FUNZIONE e quella funzione NON E' INLINE allora avrai un bell'errore del
linker :-)
Quindi le funzioni non-membro (le funzioni "lisce") devono avere il corpo in
un file .c/.cpp o devono essere messe inline in un header.
(nota: in realtà il c non dà valenza "simbolica" al concetto di header. Sei
tu programmatore che glie la dai, sapendo che solo gli headers andrebbero
inclusi (certa gente include anche i files .cpp talvolta))
(altra nota: per problemi del 95% dei compilatori c++, i templates e le
funzioni inline devono essere definite in un file .h se le si vuole usare da
più di un file .cpp. In realtà lo standard è più flessibile, ma farlo come
lo richiede lo standard è un bordello bordelloso, perchè dovresti avere una
fase di compilazione DURANTE la fase di linking, quindi due fasi di
compilazione distinte invece che una)
--- bye

 new?
No. La regola e': ad ogni chiamata a "new" deve corrispondere una 
chiamata a "delete".
-- 
	Carlo Milanesi
 
http://digilander.libero.it/carlmila

 > metodo direttamente nell'header della classe, e quando č meglio


Inoltre le definizione dei template devono essere nei file header
questo lo dice lo standard o è dovuto solo al fatto che molti
compilatori non sono in grado di compilare i template se non sono
negli header?
-- 
]\/[ad]\/[age (
www.mindreamz.net
)
"Un Maestro insegue semplicemente la sua visione di Eccellenza in
qualunque cosa sta facendo e lascia agli altri decidere se sta 
lavorando o giocando. A lui sembra sempre di fare entrambe." - Anonimo

 direttamente nel .H?
Non esiste una risposta assoluta. Intanto non e' scontato che definire
una funzione inline comporti sempre un vantaggio prestazionale, in
secondo luogo la definizione di funzioni inline introduce dipendenze
con dettagli implementativi che in molti casi e' preferibile evitare,
per esempio per tenere sotto controllo i tempi di compilazione.
In generale io considero sempre accettabile definire inline funzioni
che si limitano a chiamare una singola altra funzione o che
restituiscono direttamente il valore di un membro dato. In entrambe i
casi la dipendenza sostanzialmente esiste gia' ed e' abbastanza
ragionevole aspettarsi che le prestazioni non peggiorino.
Ciao,
Nicola

p.s. scusa per il ritardo della risposta
beh... no... dipende dal compilatore!
non è una necessità... del resto il compilatore VEDE anche i file di
implementazione, perché è quelli che COMPILA!
non vedo nessuna necessità, al massimo sepmlicità di costruzione di un
compilatore
una volta che una classe template, ad esempio, si sa con che tipi deve
essere istanziata, si creano tante classi una per ogni tipo... e non
vedo perché il compilatore sia costrettoa cercare la definizione negli
header, visto che i cpp li deve comunque compilare
semmai la difficoltà sta nel farlo in una sola passata... ma non ne
sono completamente sicuro
