Для чого використовується ключове слово "друг"?


11

Чи можете ви пояснити мені, чому саме friendключове слово віддається перевагу для надання прав доступу до приватних даних класу?


1
Якщо ви запитаєте, чому friendбуло віддано перевагу, які інші способи ви зазвичай використовуєте для доступу до даних приватного класу ззовні?
Бенджамін Баньє

@honk "Краще" може бути тут неправильним словом. Я відредагував більшу частину публікації, щоб виправити граматику та інше, і я зберіг початковий вибір слова, але, думаю, тут може бути мовний бар'єр.
Адам Лір

Я не знаю, бо я читав про друга сьогодні випадково. і в статті йдеться про те, що якщо я не використовую друга, я створять монолітний клас.
Далтон

Відповіді:


17

Друг - це класичний спосіб розширення інтерфейсу класу.
Але чудова річ, що друг явно документує ваш намір щільно прив’язати конкретні предмети до класу.

Примітка: Використовуючи товариша, ви щільно прив'язуєте друзів до класу.

Ідеальний приклад - оператори потоку в 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 потребують змін у реалізації операторів потоку). Але цього очікується. Усі частини публічного інтерфейсу (включаючи загальнодоступні та захищені методи) тісно пов'язані з реалізацією.

Але зауважте: Ви явно задокументували цю прив'язку як частину декларації класу.

Примітка. Я б не називав друга як кращим способом викриття приватних даних. Надмірне використання друга може бути так само погано, як і піддавати реалізації. Як і всі мовні особливості, його слід використовувати розумно.


Якби ви могли публічно отримати доступ до даних (наприклад, за допомогою геттера), ви б замість цього використали безкоштовну функцію?
Іоанна
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.