Вы можете объявить шаблон Foo
другом Bar
:
class Bar
{
template <class T> friend class Foo;
// same as before...
};
Теперь любой экземпляр Foo
может вызывать закрытые функции-члены Bar
.Код компилируется, но вы все равно можете подумать, стоит ли это недостатков: как указал @StoryTeller в комментариях, класс друга не только является очень сильной связью, он гарантирует доступ к любому элементу данныхи функция-член, которая по некоторым причинам, вероятно, private
или protected
.Другими словами, классы friend
нарушают инкапсуляцию, и для использования такой схемы должен быть веский аргумент.
Обратите внимание, однако, что вы на самом деле не вводите Bar
.Инъекция происходит извне, например, путем передачи экземпляра Bar
в конструктор Foo
и / или создания экземпляра Foo
с параметром шаблона Bar
.В вашем случае это может быть
template <typename T>
class Foo
{
std::shared_ptr<T> m_bar;
// same as before...
};
Foo<Bar> instance;
// ^^^ inject dependency on Bar