10 dicembre 2007

Sui template e i progetti multi-file

Notate quanto segue:

1) Quando utilizziamo i template nella definizione delle classi, il compilatore non compila effettivamente il codice della classe finché non è necessario.

Se ad esempio dichiariamo la seguente classe:

template
class Coppia
{private:
T1 primo;
T2 secondo;
public:
Coppia(T1,T2);
T1 Primo() const;
T2 Secondo() const;
};



questo codice verrà "conservato" dal compilatore finché non sia necessario compilarlo instanziando i due tipi T1 e T2, ad esempio a seguito dell'istruzione:

Coppia c1(10,2.3);


2) Quando scriviamo un programma C++ siamo soliti dividerlo in più file per questioni di modularizzazione. Tipicamente, la dichiarazione di una classe sta in un file miaclasse.h, mentre la definizione delle sue funzioni proprie sta in un file miaclasse.cpp. Includeremo miaclasse.h in tutti i .cpp del progetto che usano oggetti di quella classe, oltre che in miaclasse.cpp.

3) Ma, se si tratta di una classe modello, cioè dichiarata mediante template, il compilatore non dovrà compilare i metodi definiti in miaclasse.cpp se nessuno li usa. E quindi, non avrebbe senso compilare separatamente il file miaclasse.cpp! (Nella compilazione separata, infatti, il compilatore "non ha memoria" delle compilazioni degli altri file del progetto, e non sa se in qualcuno di questi è stata usata la classe modello)

4) Quindi l'unica via praticabile è quella di includere tutta la classe modello in ogni file .cpp del progetto che vuole usarla. Pertanto (cosa che non si poteva evincere dal file che abbiamo realizzato nella lezione del 22 novembre, template.cpp) dobbiamo scrivere anche le definizioni dei metodi della classe modello in miaclasse.h. Il file miaclasse.cpp -- per le classi modello -- non dobbiamo scriverlo né inserirlo nel progetto.

5) Il linker è in grado automaticamente di identificare la implementazione di tutti i metodi della classe modello e di collegarli alle rispettive chiamate.


Nei file qui sotto potete trovare un esempio di programmino che compila e gira correttamente:

Se provate invece a spostare le definizioni in un nuovo file templcoppia.cpp e ad aggiungere questo file al progetto, vedrete l'errore di linking.

Nessun commento: