【发布时间】:2026-02-05 15:30:01
【问题描述】:
这是单例模式的例子吗?如果不是,那么如果我们将此类用作记录器,可能会出现什么问题。 (当然它不是一个完全灵活的记录器)
#include <iostream>
#include <fstream>
using namespace std;
class logger
{
private:
static ofstream myfile;
void openfile()
{
myfile.open ("example.txt");
}
void closefile()
{
myfile.close();
}
public:
void logit(string str)
{
if (myfile.is_open() == 1)
{
myfile << str << endl;
}
else
{
openfile();
myfile << str << endl;
}
}
};
ofstream logger::myfile;
int main ()
{
logger l;
l.logit ("log from vod application");
logger l2;
l.logit ("log from guide application");
logger l3;
l1.logit ("log from application 3-1");
l1.logit ("log from application 3-2");
return 0;
}
任何讨论都会有所帮助。
开发
【问题讨论】:
-
不,不是因为它有一个公共构造函数
-
这不是单例,您可能遇到的问题是,如果在问题运行时文件被删除/移动/以其他方式被篡改,它将不会被重新创建。但这个问题与它的单例性或缺乏性没有太大关系。
-
这或多或少是 Meyer 版本的单例,其中唯一的实例是 myfile,并且您没有 getInstance 方法,而是直接访问 logit()。如果logit是静态的会更好
-
@MichaelKrelin 因此,即使它不是单例类,我们也可以将其用于日志记录而不会出现重大问题。有很多讨论建议您应该将单例用于记录器?如果将单例用于记录器,如果我们可以在没有单例的情况下实现相同的目标,我们究竟能得到什么?
-
@DeveshAgrawal,谁在乎它是否符合模式?它解决了单例应该解决的问题。虽然为什么要让 logit 在这种情况下成为非静态的,但我无法理解。