Questi tipi di dichiarazioni servono per evitare di fare inclusioni di file e, principalmente, evitare il problema dell'inclusione circolare.

Quindi con la dichiarazione anticipata, in questo caso, è possibile far funzionare il programma anche senza includere il file che contiene la classe stessa

La stessa cosa vale con le struct
codice:
struct Ciao;
e quindi con le funzioni
codice:
void Ciao(void);