Вы не можете создавать экземпляры неполного типа (компилятор ничего не знает о классе!)
Вам необходимо переместить определения ваших функций (конструктор A и B) в файл C ++, который может включать оба заголовка (или в несколько файлов C ++, если вы придерживаетесь соглашения, что у вас есть один класс на файл).
Как уже было сказано, у вашего написанного кода есть серьезная проблема: каждый A создает экземпляр B, а каждый B создает и экземпляр A. У вас будет бесконечная рекурсия, и в конечном итоге вам не хватит памяти.
Два незначительных придира: вам не нужно проверять, является ли указатель нулевым, прежде чем вызывать на нем команду удаления (безопасно удалить нулевой указатель), и вам нужно изменить защитные элементы включения (имена, начинающиеся с подчеркивания в глобальное пространство имен зарезервировано для реализации).