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