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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top