【发布时间】:2016-03-05 15:16:55
【问题描述】:
我有两个类,Repository 和 Search。 Repository 封装了存储和管理内容的逻辑,Search 封装了搜索内容的逻辑,还需要访问 Repository 对象才能读取内容。
一般来说,我想将 Repository 类的功能分为公共的,该类的每个用户都可以访问,以及私有的,它们应该只在内部可用。我遇到的问题是 Search 类应该可以访问 Repository 的私有功能,但是因为 Repository 对象将从外部传递给 Search 对象,所以它只会公开公共功能。
我现在这样做的方式是,Repository 使用 pimpl idiom 来隐藏实现细节,并且我将 Search 声明为朋友,因此它可以在实现代码中使用私有功能。
Repository.h:
// Forward declaration of implementation class
class RepositoryImpl;
// Forward declaration of friend class
class Search;
class Repository
{
public:
// public interface
private:
RepositoryImpl* pImpl;
};
搜索.h
class Search
{
public:
void searchRepository(Repository* repo);
};
搜索.cpp
void Search::searchRepository(Repository* repo)
{
repo->pImpl->someHiddenMethod();
}
这显然只是给出和想法,所以它在实际功能方面没有任何意义,但我希望它能够很好地解释我正在努力解决的问题。 有人可能会说在这里使用friend 非常好,但对我来说感觉有点“hacky”,所以如果有更好的方法(一些设计模式)来解决它,我想使用。
我也不想将这些类合并为一个(尽管这似乎是个好主意),因为它引入了某些不可接受的限制。基本上我希望能够拥有一个搜索引擎,能够使用多个存储库。如果允许以干净的方式实现目标,我愿意完成对类的重新设计。
非常感谢您。
【问题讨论】:
-
为什么不将
someHiddenMethod设为公开并从公共界面访问它? -
使
Search成为friend的Repository绝对是hackish。这是Repository的public接口不足的症状。我认为在public接口中提供对Repository的所有内容 的访问会更好。那么就不需要将friendship 授予Search。 -
qqww2 someHiddenMethod 基本上允许从存储库中检索一些我不想让用户使用的信息。至少不是直接的。
标签: c++ design-patterns implementation friend