Как правило, при разработке чего-то объектно-ориентированного я стараюсь начинать с простых классов, и пусть другие классы действуют на них как марионетки (не фанат, несмотря на то, что моделируют учеников).
В данном случае это простая работа: «Студент» - это простой класс, курс содержит «Студентов», а «Школа» содержит курсы (и, возможно, студентов).
Единственное осложнение - это печать курсов, которые посещает студент. Я бы сказал, что концептуально его не должно быть в классе Student, поскольку ему нужно больше информации, чем может предоставить простой объект.
Когда дело доходит до его реализации, вы можете либо перебирать существующие данные, либо хранить дополнительную информацию. Если вы делаете последнее, убедитесь, что дополнительная информация соответствует в нормальной системе.
Ps. Посмотрите, как вы пишете циклы с использованием итераторов в C ++.