Получается так, что подключить заголовочный файл - #include "B.h" не достаточно, что бы найти описание класса, еще необходимо прописать class B. Не понимаю тогда роли конструкции #include.
смотри пост
Fat-Zer и мой пост выше, там все указано
приведу пример, если у тебя есть заголовочные файлы
A.h и
B.h и файлы реализаций соответственно
A.cpp и
B.cpp, при компиляции будет создано две единицы компиляции
A.o(
A.h +
A.cpp) и
B.o(
B.h +
B.cpp), потом компоновщик их свяжет в один исполняемый файл, но так как ты в классе
А(в хэдере, не подключая
B.h) используешь объявление указателя на переменную класса
B, то компилятор не знает на этапе компиляции что такое класс
B(он объявлен в другой единицы компиляции) и потому ты должен сказать компилятору что класс
B - некий тип данных который будет определен позже
p.s. предварительное объявление как раз и нужно чтоб в
A.h не пихать еще и
B.h с помощью инклуда(короче говоря предварительное объявление похоже на спецификатор
extern). Было бы не плохо если ты б разобрался в компоновке, единицах компиляции и вообще процесу сборки программы