2013-08-29 52 views
1

与谷歌的帮助下,我做了一个单身日志类是:Singleton模式的解释

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

在这个神秘的'*'的声明上面看上面的8行... – Mario

+0

请注意这个单例不是线程安全的,如果这对你很重要,那么你会改变一些东西。 –

回答

2

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

这是Singleton反模式的“lazy leaky”变体:实例在第一次访问时创建,并且从不销毁。像所有尝试在C++中实现单例一样,它有一些好处:

  • 实例保证每当它被访问时都存在;
  • 实例不占用任何内存(除了指针),如果它从未访问

和一些不尽如人意的地方:

  • 实例是永远不会被破坏,所以可能被报告为内存泄漏;
  • 检查每个访问上的指针的(可能很小的)代价;
  • 创建不是线程安全的,并且使每个访问都不会产生(可能是主要的)成本,从而使其线程安全并不重要。
+0

我相信你的回答是非常完整的,但显然OP有问题了解指针的概念。也许你可以在这方面增加一些指导。 – Lugaid

+0

@Lugaid:如果是这样的话,那么[良好的入门书](http://stackoverflow.com/questions/388242)会对我的ramblings更有帮助。 –

+0

如果我在创建线程之前初始化实例,那么在多线程中使用它会很危险吗?那么现在,为什么我的函数getInstance上有一个指针,而不仅仅是静态Log GetInstance()? –

2

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

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

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

+0

感谢您指出(:D)了! –