c++ - 这是单例模式的例子吗?

标签 c++ logging singleton

这是单例模式的例子吗??如果不是,那么如果我们将此类用作记录器,可能会出现什么问题。 (当然它不是一个完全灵活的记录器)

#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;
}

任何讨论都会有所帮助。

开发

最佳答案

不,这不是单例。

要创建单例,您必须将构造函数设为私有(private)。您的类没有声明任何构造函数,因此,编译器将生成默认构造函数。这很糟糕,因为会有一个复制构造函数和赋值运算符,它们只是一点一点地复制所有成员。如果您将打开的文件的句柄或指针复制到分配的内存并尝试使用拷贝进行操作,通常会发生不好的事情。

class logger {
    static logger* the_logger;
    // other private members

    logger() : the_logger(NULL)
        { /*logger construction*/} 
public:
    static logger* logger::instance(const string& filename) {
        if (the_logger == NULL) {
            the_logger = new logger(/*arguments*/);
        }
        return the_logger;
    }

    static void cleanup(void) {
        delete the_logger;
    }
    /* other public members*/
    void debug(...)
}


int main(void) 
{
    logger::instance()->debug(blah-blah-blah);
    logger::cleanup();
}

为简单起见,我跳过了与同时访问共享资源(文件描述符或输出流)相关的代码。

此外,如果我没记错的话,您的代码将无法编译,因为静态成员只能通过静态成员函数访问。

关于c++ - 这是单例模式的例子吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19657597/

相关文章:

c++ - 编译器 g++ 无法创建 a.out 文件?

linux - Oracle 事件日志位于哪里?

python - 为什么根记录器接受来自子记录器的日志?

c# - 将记录器作为单例是一种好习惯吗?

java - 如何继承单例

javascript - 如何将设置对象从 Controller 传递给服务?

c++ - 如何使用 nlohmann/json.hpp 序列化 2 组

c++ - 将像素数组保存到 jpeg 图像文件 C++

java - Lombok @Slf4j - 记录到文件

c++ - 为struct动态分配内存