У меня есть класс контейнера с несколькими итераторами в виде вложенных классов. Структура нечто Илке это:, включая вложенные классы
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;
}
Но это дает мне ошибку компиляции: Класс Сетка имеет то же имя, что и класс, в котором она объявлена ,
Замена форвардной декларации #include "grid.h" works. Но я почему-то думаю, что это уродливо.
У меня есть два рабочих параметра. Один показывает уродливые ошибки в моей среде IDE, другой мне просто не нравится так много.
Я пробовал другие варианты, где include не входит в класс, но не удалось скомпилировать его по разным причинам.
Итак, мой вопрос: существуют ли какие-либо «лучшие практики» или включают шаблоны для обработки вложенных классов, которые слишком велики, чтобы держать их в своем закрытом файле класса?
Например будет ли способ объявить вложенный класс, как:
class Grid::Iterator
Хорошо, простое решение :) Мне просто понравилось, что они вложены, так как они очень тесно связаны с окружающим классом и совершенно бесполезны сами по себе. Можно ли иметь базовый класс (Iterator) и три производных класса (MoreIterator) в одном файле заголовка? –
Конечно, я регулярно ставил десятки классов в один файл заголовка. –