Я пытаюсь создать простой класс регистратора, и мне нужна возможность вести журнал либо в общий ostream
(cout
/cerr
), либо в файл. Дизайн, который я имею в виду, заключается в том, чтобы позволить конструктору либо взять ostream&
, либо имя файла, а в последнем случае создать ofstream&
и назначить его частному 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
, инициализированную именем файла в конструкторе?