Нет, и на самом деле это не ограничение. На мой взгляд, ограничение состоит в том, что friend
- дробящее оружие для взлома вокруг недостатков дизайна - существует в первую очередь.
Ваш класс FooA
не знает бизнеса о FooB
и FooC
и «который должен иметь возможность использовать его». Он должен иметь открытый интерфейс, а не заботится , кто может его использовать. Это точка интерфейса! Функции вызова в этом интерфейсе должны всегда оставлять FooA
в приятном, безопасном, счастливом, согласованном состоянии.
И если вы обеспокоены тем, что вы можете случайно использовать FooA
интерфейс откуда-то вы не хотели, ну просто не делайте этого; C ++ не является языком, подходящим для защиты от подобных ошибок пользователя. В этом случае ваше тестовое покрытие должно быть достаточным.
Строго говоря, я уверен, что вы сможете получить функциональность, с которой вы столкнулись, с каким-то ужасным сложным «шаблоном дизайна», но, честно говоря, я бы не стал беспокоиться.
Если это проблема для семантики дизайна вашей программы, я вежливо рекомендую, чтобы ваш дизайн имел недостаток.