Я сталкивался с этой проблемой несколько раз и хотел бы узнать, есть ли простой метод или шаблон, который я мог бы использовать для ее решения.
Представьте древовидную структуру, где каждый узел содержит контейнер STL (вектор) указателей на дочерние элементы. Я хочу, чтобы клиентский код мог проходить по этому дереву и перебирать дочерние контейнеры для доступа к другим частям.
Моя проблема в том, что я хочу сохранить инкапсуляцию для своих узлов, в то же время позволяя клиентам легко видеть всех дочерних элементов для этого узла. Я также хочу убедиться, что если клиент получает постоянную ссылку на корневой узел в дереве, то и весь доступ к последующим частям дерева также является постоянным.
Должен ли я попытаться создать класс итераторов для моего типа узла, сделать так, чтобы метод узла возвращал вектор итераторы, или есть более элегантный шаблон, который мне не хватает?
Редактировать: Я хочу еще раз подчеркнуть, что, хотя я вижу некоторые хорошие идеи, у меня есть контейнеры с указателями на другие узлы. Возвращение vector<node *>::const_iterator
не помешает клиентам вызывать неконстантные методы на узле. Он только защищает сами указатели от наведения на разные объекты.