- Сделать некоторые функции в классе контейнера статическими.
Это то, что можно назвать "прощай, ООП!"и я воздерживаюсь от его максимально возможного использования.
- Объект класса контейнера передает указатель на себя (этот указатель) на содержащийся конструктор класса.Используя этот указатель, содержащийся класс может обращаться к методам класса контейнера.
При условии, что содержащий класс реализует интерфейс, а содержащиеся классы знают только интерфейс, лично я не вижу никаких проблем,На самом деле это то, что я делаю сам.Очевидно, что нужно знать об ошибках подхода, когда, например, содержащийся объект вызывает метод контейнера во время уничтожения последнего (или любого другого момента времени, когда контейнер находится в промежуточном состоянии).
Для дальнейшего отделениясодержащиеся из содержащих классы, события или сообщения также могут быть использованы.Содержащиеся объекты не знают, где они содержатся, но вместо этого отправляют сообщения.Содержащий объект при создании содержащихся объектов регистрируется как получатель сообщений от них.Этот метод позволяет сделать объекты буквально независимыми, но требует (1) некоторой структуры обмена сообщениями, (2) из-за статической природы C ++, довольно сложной для реализации, и (3) также необходим дополнительный уровень документации, поскольку интерфейс классов теперь включает в себя обмен сообщениями.
В противном случае, дважды подумайте, почему содержащиеся объекты должны вызывать методы контейнера.Может быть, вам нужно разделить контейнер с некоторыми общими функциями на 3-й класс?Если содержащиеся объекты действительно являются активными объектами и являются логическим источником событий в системе, то вам может действительно потребоваться некоторая базовая система обработки событий / сообщений, чтобы контейнер мог эффективно запрашивать / отслеживать изменения состояния в содержащихся объектах.