У меня есть два класса: репозиторий и поиск. Репозиторий инкапсулирует логику для хранения и управления контентом, а Search инкапсулирует логику для поиска по содержимому, а также требует доступа к объекту репозитория, чтобы читать содержимое.Доступ к частному элементу реализации, не подвергая его воздействию (C++)
Как правило, я хочу разделить функциональность класса репозитория на общедоступную, что каждый пользователь класса будет иметь доступ к частному и должен быть доступен только внутри страны. Проблема заключается в том, что класс поиска должен иметь доступ к частной функции репозитория, но поскольку объект репозитория будет передан объекту поиска извне, он будет публиковать только общедоступные функции.
То, как я делаю это прямо сейчас, заключается в том, что в репозитории используется идиома pimpl, чтобы скрыть детали реализации, и объявляю поиск как друга, поэтому он может использовать частные функции в коде реализации.
Repository.h:
// Forward declaration of implementation class
class RepositoryImpl;
// Forward declaration of friend class
class Search;
class Repository
{
public:
// public interface
private:
RepositoryImpl* pImpl;
};
search.h
class Search
{
public:
void searchRepository(Repository* repo);
};
Search.cpp
void Search::searchRepository(Repository* repo)
{
repo->pImpl->someHiddenMethod();
}
Это, очевидно, просто чтобы дать и идея, так что не имеет никакого смысла с точки зрения реальной функциональности, но я надеюсь, что это хорошо объясняет, с чем я борюсь. Некоторые могут сказать, что использование друга здесь отлично, но для меня это немного «взломано», поэтому, если есть лучший способ (какой-то шаблон дизайна), чтобы обойти его, я бы хотел использовать.
Я также не хочу объединять эти классы в один (хотя это может показаться хорошей идеей), потому что он вводит определенные ограничения, которые неприемлемы. В основном я хочу иметь одну поисковую систему, имея возможность работать с несколькими репозиториями. Я открыт, хотя для завершения редизайна классов, если это позволит достичь цели в чистом виде.
спасибо, что заранее.
Почему бы не сделать этот 'someHiddenMethod' общедоступным и просто получить доступ к нему из открытого интерфейса? –
Создание 'Поиск'' '' '' 'Репозитория' определенно хакерское. Это признак неадекватного «публичного» интерфейса «Репозитория». Я думаю, что лучше будет предоставлять доступ к * содержимому * 'Repository' в' public' интерфейсе. Тогда не будет необходимости предоставлять 'friend' '' Search'. –
https://stackoverflow.com/questions/12048193/why-is-it-legal-to-inappropriately-access-privates-in-an-explicit-instantiation – David