У меня есть контейнерный класс с несколькими итераторами в качестве вложенных классов.Структура выглядит примерно так:
class Grid
{
protected:
class Iterator
{
Iterator(Grid* g) : grid(g){}
Grid* grid;
}
class MoreIterator : public Iterator
{
}
}
Теперь я хотел переместить итераторы в собственный заголовочный файл, чтобы очистить код контейнеров.
class Grid
{
protected:
#include "griditerators.h"
}
Пока что этокомпилируется без ошибок.Но:
В QtCreator строки
Iterator(Grid* g) : grid(g){}
Grid* grid;
помечены как ошибки, говорящие мне "Сетка не является именем типа".
Я думал, что смогу решить это с помощьюпредварительное объявление в файле griditerator.h:
class Grid;
class Iterator
{
Iterator(Grid* g) : grid(g){}
Grid* grid;
}
Но это дает мне ошибку компиляции: Class Grid имеет то же имя, что и класс, в котором он объявлен.
Заменапредварительное объявление с #include "grid.h" работает.Но я почему-то считаю это безобразным.
Так что у меня есть два варианта работы.Один показывает ужасные ошибки в моей IDE, другой мне просто не очень нравится.
Я пробовал другие варианты, где include не входит в класс включения, но не удалось скомпилировать по другим причинам.
Итак, мой вопрос: есть ли "лучшие практики" или шаблоны для обработки вложенных классов, которые слишком велики, чтобы держать их в своем файле классов?
Например, будет лиспособ объявить вложенный класс как:
class Grid::Iterator