这是单身人士模式的例子吗?

时间:2013-10-29 11:58:50

标签: 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;
}

任何讨论都会有所帮助。

Devesh

3 个答案:

答案 0 :(得分:3)

不,这不是单身人士。

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

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();
}

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

另外,如果我没记错的话,你的代码将无法编译,因为只能使用静态成员函数访问静态成员。

答案 1 :(得分:1)

它不可能是一个单身人士:

  1. 您的code1
  2. 中有 3 个实例
  3. 该类有一个公共构造函数,只需创建一个新实例

答案 2 :(得分:1)

正如其他人所说,它不是单身人士。它是一个Monostate:http://c2.com/cgi/wiki?MonostatePattern,它是相关但不同的。