2016-02-23 82 views
0

單例設計模式表示我們應該在「單實例」類中定義一個私有靜態屬性。然而,沒有適當的解釋爲什麼數據成員必須是私有靜態的。如果數據成員是私人的,它會有什麼區別嗎?Singleton類中的靜態私有數據成員

在下面的代碼:

class Singleton 
{ 
public: 
    static Singleton* getInstance(); 

private: 
    Singleton(){/*Private constructor*/} 
    ~Singleton(){/*Private destructor*/} 
    static Singleton * instance; //Why static is required? 
}; 

請問這有什麼區別,如果數據成員instance不是靜態的?

編輯: 通過公開析構函數,它會改變單身設計的屬性嗎?

+2

這可能是感興趣的爲好; http://stackoverflow.com/q/1008019/3747990 – Niall

回答

2

靜態意味着它是類的一部分,並且該類的所有對象(實例)都將指向同一個實例。

「getInstance」是一個靜態方法,它只能訪問靜態對象。如果「實例」不是靜態的,而不是「類」的一部分,那麼「getInstance」不能返回實例。

儘量與實例聲明爲靜態的非運行下面的代碼:

static Singleton* getInstance() 
{ 
    if (instance == nullptr) 
     instance = new Singleton(); 
    return instance; 
} 
2

對於一類是單身,你應該從它創建對象禁止用戶。所以你的構造函數是私有的,並且也禁止複製構造函數和賦值運算符。

Classname(Classname const&) = delete; 
Classname(Classname const&&) = delete; 
Classname& operator=(classname const&) = delete; 
Classname& operator=(classname const&&) = delete; 

然後,獲取實例的唯一方法是使用該類的某個靜態函數,而靜態函數只能訪問靜態變量。這就是爲什麼實例變量總是靜態變量。

爲的getInstance另一個替代方案是

static Classname& getInstance() 
{ 
    static Classname instance; 
    return instance; 
}