簡體   English   中英

Singleton類中的靜態私有數據成員

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM