Перейти до вмісту

Friend в С++


В темі одне повідомлення

#1 Amarok

    Старійшина

  • Користувачі
  • PipPipPipPipPipPipPipPipPipPip
  • 2350 повідомлень
  • Стать:Чоловік
  • Місто:Дубно -> Нетішин -> Київ -> New York

Відправлено 17.01.2013 – 02:11

  • 1
Досить часто зустрічаються дискусії на тему цієї "фічі" мови. В основному хребет дискусії заключається в: чи декларування "друзів" класу ламають чи розширюють енкапсуляцію?

Ламання енкапсуляції означає що можливо отримати внаслідок певної неуважності такий собі експлойт, тобто доступ до даних до яких ви наче не очікуєте щоб хтось міг змінювати (таке можливо, через певну маніпуляцію з реферансами). Приклад позитовного боку може бути у випадку з фабриками коли ви хочете щоб тільки фабрика могла коструювати обєкти.

В тих ситуаціях можна обійтись і без френдів, використовуючи константні геттери чи протектед якщо так дуже треба щоб класи мали доступ до приватних даних і в край не можете написати геттери. Тобто виходить що ця "фіча" не така уже й потрібна чи потрібна але у дуже рідкісних випадках.

Хоча деякі вважають френди як окремий рівень доступу. На мою думку, стосовно рівня доступу то це вже швидше всього-на-всього як виключення для прайвет а не окремий рівень доступу.


Так от, яка ваша позиція стосовно декларування френдів для класів?

#2 Harmyder

    Чайник

  • Користувачі
  • Pip
  • 9 повідомлень

Відправлено 24.01.2017 – 10:55

Однозначно позитивна. Звернімо увагу на оператори для якогось класу, як-от

class T {
public:
friend std::ostream& operator<<(std::ostream&, const T&);
private:
int data_;
};


inline std::ostream& operator<<(std::ostream& os, const T& obj)
{
os << obj.data_;
return os;
}


Звісно, оператор не обов'язково має бути другом. Але це нормально робити його другом, тому що зазвичай код оператора пишеться тим самим розробником, чи командою, яка розробляє клас.
  • 0



Кількість користувачів, що читають цю тему: 1

0 користувачів, 1 гостей, 0 анонімних