gpt4 book ai didi

c++ - 访问私有(private)实现成员而不公开它们(C++)

转载 作者:行者123 更新时间:2023-11-30 03:46:38 25 4
gpt4 key购买 nike

我有两个类,存储库和搜索。 Repository 封装了存储和管理内容的逻辑,Search 封装了搜索内容的逻辑,还需要访问 Repository 对象才能读取内容。

一般来说,我想将 Repository 类的功能分为公共(public)的,该类的每个用户都可以访问,以及私有(private)的,它应该只在内部可用。我遇到的问题是 Search 类应该可以访问 Repository 的私有(private)功能,但是因为 Repository 对象将从外部传递给 Search 对象,它只会公开公共(public)功能。

我现在的做法是 Repository 使用 pimpl idiom 来隐藏实现细节,并且我将 Search 声明为 friend,因此它可以在实现代码中使用私有(private)功能。

存储库.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”所以如果有更好的方法(一些设计模式)来解决它,我想使用。

我也不想将这些类合并为一个类(尽管这看起来是个好主意),因为它引入了某些 Not Acceptable 限制。基本上我希望能够拥有一个搜索引擎,能够使用多个存储库。如果允许以干净的方式实现目标,我愿意完成类的重新设计。

非常感谢您。

最佳答案

您可以创建一个接口(interface),比如 SearchableSearch 使用并由 RepositoryImpl 实现。然后,向 Repository 添加一个公共(public)接口(interface),该接口(interface)返回 pImpl 成员但缩小到 Searchable 接口(interface)。

这样做的好处是您不必将 RepositoryImpl 的所有实现细节公开给 Search,这让您的方法感觉像是破解。

// in Search.h
class Searchable
{
friend class Search;
virtual void internal_method () = 0;
//...
protected:
virtual ~Searchable () = default;
};

// in Repository.cpp
class RepositoryImpl : public Searchable //...
{
//...
};

Searchable * Repository::searchable () { return pImpl; }

// in Search.cpp
void Search::searchRepository(Repository* repo)
{
repo->searchable()->internal_method();
}

关于c++ - 访问私有(private)实现成员而不公开它们(C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34024825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com