1

在谷歌的帮助下,我制作了一个单例日志记录类,它是:

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

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

4

2 回答 2

2

它是指向您的类的唯一一个实例的指针。

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

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

于 2013-08-29T15:03:49.450 回答
2

它是一个指针,因此它最初可以为空;然后指向new在第一次访问时使用创建的实例;见GetInstance功能。

这是 Singleton 反模式的“惰性泄漏”变体:实例在第一次访问时创建,从不销毁。就像所有在 C++ 中实现单例的尝试一样,它有一些优点:

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

还有一些不好的地方:

  • 实例永远不会被破坏,因此可能会被报告为内存泄漏;
  • 在每次访问时检查指针的(可能很小)成本;
  • 创建不是线程安全的,并且在每次访问都不会产生(可能是主要的)成本的情况下使其成为线程安全的并不是一件容易的事。
于 2013-08-29T15:12:08.717 回答