单身模式解释

时间:2013-08-29 14:58:19

标签: c++ singleton

在google的帮助下,我创建了一个单例记录类,即:

class Log{
public:
    void Initialize(const char* fileName, int logLevel, ...);
    void outString(const char* str, ...);
    void outError(const char* str, ...);
    void outWarning(const char* str, ...);
    static Log* GetInstance() 
    {
        if (!m_instance)
            m_instance = new Log();
        return m_instance;
    }
private:
    Log() {}
    Log(const Log&);
    Log& operator=(const Log&); 
private:
    static Log *m_instance;
    void SetColor(bool stdout_stream, Color color);
    string getCurrentTime();
    void ResetColor(bool stdout_stream);
    int m_logLevel;
    ofstream *m_file;
};

现在我想知道*在这里是什么:静态日志* m_instance;为什么我们将它设置为指针?我真的不明白。我的意思是,它会指向什么?

2 个答案:

答案 0 :(得分:2)

它指向您班级中唯一的一个实例。

您可以通过'Log :: getInstance()'静态函数访问此实例。

当我们在实践中不需要在代码中使用多个类的实例时,我们使用单例模式。

答案 1 :(得分:2)

它是一个指针,因此它最初可以为null;然后指向在第一次访问时使用new创建的实例;请参阅GetInstance函数。

这是Singleton反模式的“懒惰泄漏”变体:实例在首次访问时创建,并且永远不会被破坏。像所有在C ++中实现单例的尝试一样,它有一些好处:

  • 只要访问该实例,该实例就会保证存在;
  • 如果从未访问过实例,则实例不会占用任何内存(指针除外)

和一些坏点:

  • 实例永远不会被销毁,因此可能会被报告为内存泄漏;
  • 检查每次访问时指针的(可能是次要的)成本;
  • 创建不是线程安全的,并且在不使每次访问产生(可能是主要的)成本的情况下使其成为线程安全的并非易事。