我有一个模板类'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