dichiarazione anticipata nella directory dei sorgenti multiple; esemplificazione template
-
19-09-2019 - |
Domanda
Sto cercando un libro bello, materiale di riferimento che si occupa di dichiarazione anticipata di classi esp. quando le fonti sono in più directory, per esempio. Classe A in Dira è avanti dichiarata in classe B in DIRB? Come è questo fatto?
Inoltre, qualsiasi materiale per problemi di modello, usi avanzati e problemi instantation, altamente appreicated?
Grazie.
Soluzione
dichiarazioni a termine non hanno nulla a che fare con la struttura della directory del progetto. È possibile inoltrare dichiarare qualcosa di ancora non esistente nel progetto. Essi sono principalmente utilizzati per risolvere i riferimenti ciclici tra le classi e accelerare compilazione quando la dichiarazione di classe completa non è necessaria, e il corrispondente #include possono essere sostituiti con una dichiarazione anticipata.
Per determinare quando una dichiarazione anticipata è sufficiente, la query sizeof () di solito può rispondere alla domanda. Ad esempio,
class Wheel;
class Car
{
Wheel wheels[4];
};
In questa dichiarazione, una dichiarazione anticipata non può essere utilizzato in quanto il compilatore non può determinare la dimensione di un auto: non conosce la quantità di dati contengono le ruote. In altre parole, sizeof(Car)
è sconosciuta.
per quanto riguarda anche i modelli, le classi in avanti dichiarate non possono essere utilizzati come parametri di modello se la classe modello contiene membri di dati del parametro di template (ma i loro puntatori possono essere). Per esempio,
template<class T> class pointer
{
T *ptr;
};
class Test;
pointer<Test> testpointer;
è legale, ma
std::vector<Test> testvector
non verrà compilato.
A causa delle limitazioni di cui sopra, le classi in avanti dichiarate sono generalmente utilizzati come puntatori o riferimenti.
Non so se c'è un libro sull'argomento, ma si può vedere questo sezione C ++ faq lite.
Altri suggerimenti
In linea generale è possibile inoltrare dichiarare nelle intestazioni come un mezzo per evitare completa comprende o come un modo per permettere riferimento circolare (cattivo). È possibile utilizzare un tipo in avanti dichiarato dal puntatore o riferimento o solo tipo di ritorno.
Large-Scale C ++ Software Design by Giovanni Lakos (Book Review qui) indirizzi progettazione fisica (file) e progettazione logica e come si riferiscono a componenti software (che non sono sempre 1: 1 con le classi).
se sono in directory parallele è possibile includere le cose come
#include "../dirB/B.h"
ma nell'intestazione basta chiamare questa linea per decleration avanti
class B;
al posto di questo, si può separare la vostra includono directory e le directory di origine.
così allora si può mostrare includono directory come questa directory ed è possibile aggiungere un'intestazione chiamando
#include "dirB/B.h"
dal momento che si farà un decleration avanti su un colpo di testa, che non sarà un problema.