我正在尝试制作一个简单的记录器类,并且我希望能够记录到通用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