在进行依赖注入时公开私有方法
Expose private method when doing dependency injection
我有一个模板类'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();
}
您可以将Foo
模板声明为Bar
的朋友:
class Bar
{
template <class T> friend class Foo;
// same as before...
};
现在,任何Foo
实例化都能够调用Bar
的私有成员函数。代码可以编译,但您仍然可以考虑这是否值得缺点:正如@StoryTeller在注释中指出的那样,友元类不仅是一个非常强大的耦合,它还保证访问可能由于某种原因private
或protected
的任何数据成员和成员函数。换句话说,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
相关文章:
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 模板或链接接缝依赖注入有哪些替代方案来测试非虚拟方法?
- 我的类中有方法的指针数组,但我不能调用我的方法.代码如下
- 如何处理一个子类有方法,而另一个没有方法的子类?
- 有方法的类,我不明白类的外观
- 是否有方法为模板参数指定所需的定义
- 是否有方法将相对库路径添加到可执行文件以避免设置LD_library_path
- std::chrono中是否有帮助注入system_clock进行单元测试的设施
- 是否有方法将所有赋值运算符(+=、*=等)转发为隐式使用重写的直接赋值运算符(=)
- 是否有方法使用vector的内容作为键和自定义值来初始化unordered_map ?
- 在调用main函数之前,是否有方法解析命令行选项?
- 在c++中是否有方法对成员变量(类)进行后期初始化?
- 是否有方法为任何指针类型定义转换操作符
- 是否有方法为窗口窗体中的特定按钮挂钩鼠标事件
- 是否有方法检测内联函数ODR违规
- 在Windows Vista+上不注册proppage.dll,是否有方法访问远程过滤器图?
- 模板:只执行类中有方法的方法
- 是否有方法使Visual Studio对include区分大小写
- 是否有方法在调用函数时防止隐式的static_cast ?