Предоставлять приватный метод при выполнении внедрения зависимостей - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть шаблонный класс 'Foo' и другой не шаблонный класс 'Bar'.Я хочу иметь экземпляр Bar внутри Foo и выставить одну из функций Bar, которая является приватной только для Foo.

Пример:

template <typename T>
class Foo
{
    std::shared_ptr<Bar> m_bar;
    bool Func()
    {
        return m_bar->DoSomething();
    }
}

class Bar
{
private:
    bool DoSomething();
}

1 Ответ

0 голосов
/ 07 февраля 2019

Вы можете объявить шаблон 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...