2013-08-29 81 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)了! –