Вы используете предварительные объявления, но вы все равно включаете файлы .h
рекурсивно. Смысл предварительных деклараций заключается в том, что вам не нужно включать заголовки
вперед объявлен класс, тем самым нарушая взаимную зависимость.
Также должно быть достаточно использовать предварительное объявление для одного классов, а не для них обоих.
Я бы предложил следующую структуру:
SingleListIterator.h :
class SingleList; // forward declaration
class SingleListIterator {
// Declarations, only using pointers/references to SingleList.
// Definitions that need to know the structure of SingleList (like maybe
// a constructor implementation) need to be done in the .cpp file.
};
SingleList.h
#include "SingleListIterator.h" // include full declaration
class SingleList {
// declarations
};
SingleListIterator.cpp
#include "SingleListIterator.h"
#include "SingleList.h" // include full declaration of the type
// forward-declared in SingleListIterator.h
// method definitions,...
SingleList.h
#include "SingleList.h" // include full declarations of everything
// definitions
Таким образом, нет файлов, которые взаимно включают друг друга, и все типы полностью известны в файлах реализации (.cpp).