Я пытаюсь реализовать класс дескриптора файла, подобный тому, который представлен на странице часто задаваемых вопросов Бьярна Страуструпа. (Перейдите к «Почему C ++ не предоставляет конструкцию« finally »» .) Однако, в отличие от его примера, я хочу использовать файловые потоки C ++ вместо FILE*
.
Сейчас я рассматриваю возможность создания класса FileHandleBase
или чего-то с таким же именем и двух производных классов - один для входных файлов и один для выходных файлов. Ниже приведена реализация, которую я написал в качестве подтверждения концепции; имейте в виду, что это очень просто и незакончено.
class FileHandle {
public:
FileHandle(const char* fn, ios_base::openmode mode = ios_base::in | ios_base::out) {
file.open(fn, mode);
// Check to make sure file is open
}
FileHandle(const string &fn, ios_base::openmode mode = ios_base::in | ios_base::out) {
file.open(fn, mode);
// Check to make sure file is open
}
~FileHandle() {
file.close();
}
private:
fstream file;
};
Я хотел бы знать, является ли это жизнеспособным способом создания дескриптора файла, то есть хороша ли моя идея наследования. Я также хочу знать, как лучше всего работать с параметром ios_base::openmode
, потому что на справочной странице C ++ для std::ifstream
сказано следующее:
Обратите внимание, что даже если поток является входным потоком, его внутренний объект filebuf может быть настроен также на поддержку операций вывода.
В каких случаях ifstream
будет использоваться для операций вывода и, аналогично, когда of stream
будет использоваться для операций ввода; и я должен ограничить параметры для параметра ios_base::openmode
для моего класса дескрипторов файлов? Таким образом, мой дескриптор входного файла будет обрабатывать только операции ввода, а выходная версия будет обрабатывать только операции вывода.