[英]Static private data member in Singleton class
Singleton設計模式說,我們應該在“單個實例”類中定義一個私有靜態屬性。 但是,沒有適當的解釋為什么數據成員必須是私有靜態的。 如果數據成員只是私有的,會有所不同嗎?
在下面的代碼中:
class Singleton
{
public:
static Singleton* getInstance();
private:
Singleton(){/*Private constructor*/}
~Singleton(){/*Private destructor*/}
static Singleton * instance; //Why static is required?
};
如果數據成員instance
不是靜態的,會有所不同嗎?
編輯:通過將析構函數公開,它會改變單例設計的屬性嗎?
要使類成為單例,您應禁止用戶從中創建對象。 因此,您可以將構造函數設為私有,並防止復制構造函數和賦值運算符。
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;
}
靜態意味着它是類的一部分,並且該類的所有對象(實例)將指向同一實例。
“ getInstance”是一個靜態方法,只能訪問靜態對象。 如果“實例”不是靜態的,不是“類”的一部分,則“ getInstance”不能返回該實例。
嘗試使用聲明為非靜態的實例運行以下代碼:
static Singleton* getInstance()
{
if (instance == nullptr)
instance = new Singleton();
return instance;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.