I'm trying to make a simple logger class, and I want the ability to either log to either a generic ostream
(cout
/cerr
) or a file. The design I have in mind is to allow the constructor to either take an ostream&
or a filename, and in the latter case create an ofstream&
and assign that to the class' private ostream&
like so:
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;
}
};
Doing such gives me an error that ofstream
's assignment operator is private. Looking over that again, it occurred to me that making a reference to a local object probably wouldn't work, and making os
a pointer to an ostream
and declaring and deleting it on the heap worked with the ofstream
case, though not with the ostream
case, where the ostream
already exists and is just being referenced by os
(because the only place to delete os
would be in the constructor, and I don't know of a way to determine whether or not os
is pointing to an ofstream
created on the heap or not).
So how can I make this work, i.e. make os
reference an ofstream
initialized with a filename in the constructor?