Когда вы передаете указатель, который указывает обратно на объект контейнера, этот указатель иногда называется обратным указателем . Я вижу, что этот метод все время используется в библиотеках с графическим интерфейсом, где виджет может нуждаться в доступе к своему родительскому виджету.
При этом вы должны спросить себя, есть ли лучший дизайн, который не включает круговые зависимости (круговой в том смысле, что контейнер зависит от контактирующего лица, а контактируемый - от контейнера).
Вы не строго должны создавать объекты динамически, чтобы техника обратного указателя работала. Вы всегда можете взять адрес выделенного стека (или статически выделенного) объекта. Пока сохраняется жизнь этого объекта, пока другие используют указатели на него. Но на практике этот метод обычно используется с динамически создаваемыми объектами.
Обратите внимание, что вы также можете использовать обратную ссылку вместо обратного указателя.
Я думаю, я знаю, что вызывает ваши ошибки сегментации. Когда ваши векторы перераспределяют свою память (в результате увеличения их размера), адреса старых векторных элементов становятся недействительными. Но дети (и внуки) этих объектов по-прежнему хранят старые адреса в своих указателях!
Чтобы сработал обратный указатель, вам нужно будет динамически распределять каждый объект и сохранять его указатели в векторах. Это сделает управление памятью намного более запутанным, поэтому вы можете использовать умные указатели или boost :: ptr_containers.
Увидев комментарий, который вы сделали в другом ответе, теперь у меня есть лучшее представление о том, чего вы пытаетесь достичь. Вы должны исследовать родовое дерево структуры и составной шаблон . Составной шаблон обычно используется в приведенном выше примере с виджетом.