Я пытаюсь создать простой класс регистратора, и мне нужна возможность либо вести журнал, либо в общем ostream
( cout
/ cerr
) или файл. Я имею в виду дизайн, позволяющий конструктору принимать либо ostream &
, либо имя файла, а в последнем случае создавать ofstream &
и назначать его классу private ostream &
вот так:
class Log {
private:
std::ostream& os;
public:
Log(std::ostream& os = std::cout): os(os) { }
Log(std::string filename) {
std::ofstream ofs(filename);
if (!ofs.is_open())
// do errorry things
os = ofs;
}
};
Выполнение этого дает мне сообщение об ошибке, что оператор присваивания ofstream
является частным.Просматривая это еще раз, мне пришло в голову, что создание ссылки на локальный объект, вероятно, не сработает, и создание os
указателя на ostream
и объявление и удаление его в куча работала со случаем ofstream
, но не со случаем ostream
, где ostream
уже существует и на него только что ссылается os
(поскольку единственное место для удаления os
будет в конструкторе, и я не знаю способа определить, указывает ли os
на ofstream
созданы в куче или нет).
Итак, как я могу выполнить эту работу, то есть сделать так, чтобы os
ссылался на ofstream
, инициализированный именем файла в конструкторе?