Классы в C ++ сделаны friend
s, чтобы указать на особую намеренную сильную связь между классами.Такое использование friend
infact улучшает инкапсуляцию, а не разрушает ее, как, возможно, популярное чувство.
Как?
Без дружбы единственным нехакерским способом раскрыть функциональность другому классу было бы предоставить public
Функции-члены get
и set
на самом деле нарушают инкапсуляцию, потому что все классы (даже те, кому это не нужно) теперь имеют доступ к этим методам и, следовательно, члены увеличивают риск потенциального нарушения данных классов.
Вернемся к вашей ситуации. Если у вас есть 100 классов, которым нужен доступ к этому конкретному классу, то у вас уже был правильный дизайн на месте, когда эти методы были public
.Теперь попытка сделать эти методы private
для будущих классов - это попытка взломать ваш существующий дизайн, ваш дизайн не поддерживает его.
Создание существующих классов как friend
s не идеально вписывается в вышеупомянутые критерии и, следовательно, не является хорошим выбором для сценария.
Однако, учитывая ситуацию, нет другого пути, в которомВы можете реализовать это.Создание существующих классов как friend
и предоставление им специального доступа кажется единственным способом.Это все еще плохо, потому что 100 классов, которые имели доступ только к нескольким методам, теперь будут иметь доступ ко всему вашему классу.