Чи можете ви пояснити мені, чому саме 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
було віддано перевагу, які інші способи ви зазвичай використовуєте для доступу до даних приватного класу ззовні?