Non c'è un modo "standard" se è questo che intendi, ma dipende dal contesto.
Le forward declaration servono per due motivi: il primo è spezzare le dipendenze circolari tra header file (A include B che a sua volta include A), la seconda è velocizzare i tempi di compilazione. Ma solo il primo motivo rende obbligatorie le forward declaration.
Nel tuo esempio:
a B non interessa com'è fatta la classe A e nemmeno al compilatore, perché è sufficiente sapere che esiste un qualcosa che si chiama A di cui bisogna gestire il puntatore. Eventualmente sarà in B.cpp che B deve sapere come è fatto A.codice:class B { //... private: A* mA; };
Diversamente se ci fosse stato scritto:
allora si che B deve sapere come è fatto A, altrimenti non saprebbe come costruirlo.codice:class B { //... private: A mA; };
Ricapitolando: se le dichiarazioni delle classi contengono solo dei puntatori a qualcosa (nel nostro caso A*) è sufficiente una forward declaration, viceversa se le dichiarazioni delle classi contengono oggetti fatti e finiti (ad esempio A) è obbligatorio inserire il corrispondente .h.
Ma ambedue i modi non sono ne obbligatori ne sbagliati, a meno che non si verifichino dipendenze circolari, nel qual caso si può solo usare la forward declaration.

Rispondi quotando