【问题标题】:Expose private method when doing dependency injection进行依赖注入时暴露私有方法
【发布时间】:2019-07-01 09:21:12
【问题描述】:

我有一个模板类“Foo”和另一个非模板类“Bar”。 我想在 Foo 中拥有 Bar 的实例,并公开 Bar 的一个仅对 Foo 私有的函数。

例子:

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

class Bar
{
private:
    bool DoSomething();
}

【问题讨论】:

  • 欢迎来到 Stack Overflow!
  • 您可以阅读this page了解更多信息。

标签: c++ templates dependency-injection


【解决方案1】:

您可以将Foo 模板声明为Bar 的朋友:

class Bar
{
    template <class T> friend class Foo;
    // same as before...
};

现在,任何Foo 实例化都可以调用Bar 的私有成员函数。代码可以编译,但您仍然可以考虑这是否值得缺点:正如 cmets 中的 @StoryTeller 所指出的,朋友类不仅是一个非常强的耦合,它还保证了对 any 数据的访问出于某种原因可能是privateprotected 的成员和成员函数。换句话说,friend 类确实违反了封装,使用这种方案应该有一个强有力的论据。

但是请注意,您并没有真正注入 Bar。注射从外部发生,例如通过将Bar 实例传递给Foo 的构造函数,和/或通过使用Bar 模板参数实例化Foo。在你的情况下,这可能是

template <typename T>
class Foo
{
    std::shared_ptr<T> m_bar;
    // same as before...
};

Foo<Bar> instance;
//  ^^^ inject dependency on Bar

【讨论】:

  • “现在,任何 Foo 实例化都可以调用 Bar 的私有成员函数” - 还有更多
猜你喜欢
  • 2019-09-28
  • 2019-10-18
  • 2016-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 2018-03-17
  • 2019-12-28
相关资源
最近更新 更多