Poza tym wszystkim co napiszę, nigdy się nie spotkałem z zapisem np.
class B* b;
więc nie wiem czy wszystko co napiszę jest prawdą
class A *a;
class A {};
Tutaj deklarujesz wskaźnik na klasę A i potem definiujesz klasę A.
class A {
class B;
B* b;
};
Tutaj masz klasę A, w której jest zagnieżdżona klasa B. Oraz w klasie A masz wskaźnik na obiekt klasy B.
To
class A::B {};
jest definicją konstruktora klasy B
class A {
class B* b;
};
Tutaj masz klasę A i w niej wskaźnik na obiekt klasy B. A tu
class A::B {};
Prubujesz zdefiniować konstruktor klasy B klasę B, która jest zagnieżdżona w klasie A. Tyle, że w klasie A czyli tu
class A {
class B* b;
};
nie ma nigdzie deklaracji zagnieżdżonej klasy B. Dla tego kompilator się buntuje.