Как сделать ссылку ostream на ofstream? (C ++)

Я пытаюсь создать простой класс регистратора, и мне нужна возможность либо вести журнал, либо в общем 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 , инициализированный именем файла в конструкторе?

9
задан 27 February 2012 в 01:50
поделиться