Intestazioni comprese tra loro in C ++

Sono un principiante di C ++, ma non sono stato in grado di trovare la risposta a questa domanda (molto probabilmente banale) online. Sto avendo qualche problema nella compilazione di un codice in cui due classi si includono l’una con l’altra. Per iniziare, le mie #include affermazioni dovrebbero andare all’interno o all’esterno dei miei macro? In pratica, questo non è sembrato importare. Tuttavia, in questo caso particolare, ho problemi. L’inserimento delle istruzioni #include al di fuori delle macro fa sì che il compilatore riceva e mi dà errori di “#include annidati troppo profondamente”. Questo sembra avere senso dal momento che nessuna delle due classi è stata definita completamente prima che #include sia stato invocato. Tuttavia, stranamente, quando provo a inserirli, non riesco a dichiarare un tipo di una delle classi, perché non è riconosciuto. Ecco, in sostanza, quello che sto cercando di compilare:

ah

#ifndef A_H_ #define A_H_ #include "Bh" class A { private: B b; public: A() : b(*this) {} }; #endif /*A_H_*/ 

Bh

 #ifndef B_H_ #define B_H_ #include "Ah" class B { private: A& a; public: B(A& a) : a(a) {} }; #endif /*B_H_*/ 

main.cpp

 #include "Ah" int main() { A a; } 

Se fa la differenza, sto usando g ++ 4.3.2.

E per essere chiari, in generale, dove dovrebbero andare le dichiarazioni #include? Li ho sempre visti andare fuori dai macro, ma lo scenario che ho descritto chiaramente sembra infrangere questo principio. Grazie a tutti gli aiutanti in anticipo! Per favore permettimi di chiarire il mio intento se ho commesso degli errori stupidi!