Іншим варіантом є використання ідіоми PIMPL , де частина реалізації структури є вказівником на інший тип. Більшість користувачів класу просто включить звичайний файл заголовка, де реалізація є непрозорим покажчиком. Класи, яким потрібен доступ до приватних даних, можуть включати заголовок, що визначає інший тип, та використовувати інтерфейс, який він надає.
Це загальна модель для програмістів на С, які бажають функціонувати як друзів. На мій погляд, він також більш уважно роздумує про розмежування проблем (загалом хороший принцип дизайну, який призводить до багаторазового використання, ортогональний код), а не інкапсуляцію (специфічна для OO методика, яка корисна для здійснення розділення проблем, але також часто неправомірно використовується перекомплікація речей).
Він має перевагу перед другом у тому, що він взагалі не з’єднує друга-ер з другом. Деякі люди можуть стверджувати, що це недолік, оскільки тепер кожен може "подружити" ваш клас. Я думаю, що це невиправданий страх, оскільки ти все ще робиш стосунки явними (включивши заголовок). Якщо ти боїшся цього, ти боїшся своєї (або твоєї колеги) здатності приймати розумні архітектурні рішення. Але якщо ви не можете прийняти ці рішення належним чином, чому ви зараз довіряєте собі friend
?
Це має недолік вартості виконання. Зберігаючи дані в покажчику, ви погіршуєте когерентність кешу і більше рахунків розподілу, і вам також потрібен деструктор для його очищення.