Можете ли вы объяснить мне, почему friend
ключевое слово является предпочтительным для предоставления прав доступа к закрытым данным класса?
Можете ли вы объяснить мне, почему friend
ключевое слово является предпочтительным для предоставления прав доступа к закрытым данным класса?
Ответы:
Friend - это классический способ расширения интерфейса класса.
Но самое замечательное в том, что друг явно задокументировал ваше намерение тесно связать определенные предметы с классом.
Примечание. Используя друга, вы жестко привязываете друзей к классу.
Прекрасным примером являются операторы потока в C ++
class Plop
{
private:
int value;
friend std::ostream& operator<<(std::ostream& stream, Plop const& data);
friend std::istream& operator>>(std::istream& stream, Plop& data);
};
std::ostream& operator<<(std::ostream& stream, Plop const& data)
{
return stream << data.value << " ";
}
std::istream& operator>>(std::istream& stream, Plop& data)
{
return stream >> data.value;
}
Здесь мы расширяем открытый интерфейс класса Plop таким образом, который позволяет нам направлять объект в поток и из потока, но не подвергая внутреннюю реализацию или вызывая будущие трудности реализации, требуя использования методов get / set, которые должны поддерживаться (потому что они будут частью открытого интерфейса), даже если внутренняя реализация изменена.
Примечание. Это НЕ нарушает инкапсуляцию, но тесно связывает потоковые операторы с реализацией класса Plop (т.е. любое изменение в реализации класса Plop потребует изменения в реализации потоковых операторов). Но это ожидается. Все части открытого интерфейса (включая публичные / защищенные методы) тесно связаны с реализацией.
Но обратите внимание: вы явно задокументировали эту привязку как часть объявления класса.
Примечание: я бы не назвал друга предпочтительным способом раскрытия личных данных. Чрезмерное использование друга может быть так же плохо, как разоблачение реализации. Как и все языковые функции, его следует использовать разумно.
friend
было предпочтительным, какие другие способы вы обычно используете для доступа к данным частного класса извне?