Итак, я пытался быть более строгим в создании любых переданных параметров, которые не должны быть затронуты функцией const
,
Одна ситуация, с которой я столкнулся в некоторых моих кодах на C ++, — это случай, когда объект может измениться, но я хочу «заблокировать» функции от доступа к определенной ключевой функциональности объекта. Например, для std::ifstream
дескриптор файла, я могу запретить функции закрывать файл.
Если я передам это как const &
, const
Кажется, часть мешает мне выполнить стандартный ввод / вывод файла.
например Я хочу что-то вроде
void GetTags(Arr<std::string> & tags, std::ifstream const& fileHandle)
…но написано таким образом, чтобы разрешить файловый ввод / вывод, но не операции открытия / закрытия.
Есть ли хороший / надежный способ сделать это в C ++? Что будет считаться лучшей практикой?
Это уже было сделано для вас стандартным дизайном библиотеки: передайте ссылку на база учебный класс std::istream
вместо этого, который не имеет понятия открытия или закрытия — он выставляет только интерфейс потока.
void stream_me(std::istream & is);
std::ifstream is("myfile.txt");
stream_me(is);
На вашем месте я бы просто передал std::istream
вместо.
Вы можете обернуть ifstream в объект, который предоставляет только те функции, которые вы хотите, чтобы вызывающий мог использовать.
Однако, если у вас есть куча разных функций, каждая с разным подмножеством функциональности ifstream, вы получите множество разных классов-оболочек; так что я не рассматриваю это как общее решение.
Я думаю, что лучшим способом было бы обернуть ifstream
в новом классе, который имеет только функции-члены, соответствующие желаемой функциональностиGetTags
иметь доступ к. Тогда передайте что не то ifstream
в качестве второго аргумента GetTags
,