2012-07-06 75 views
0

可能重複:
What is so bad about singletons?
Singleton pattern in C++這是在C++中創建單例類的正確方法嗎?

我想創建一個單獨的類。爲此,我創建了一個類,其所有成員和方法都是靜態的。像這樣的東西。

class a 
{ 
    static int a; 
    static GetA(); 
} 

現在所有想要使用我的單例類的類都不能爲我的類創建任何對象,並且也會得到相同的值。我只想知道這個實現是否能夠解決所有的目的,並滿足創建單例類的所有條件。

+1

這不是一個實現。它對此一無所知。 – Nawaz 2012-07-06 12:24:07

+1

正如所寫,任何人都可以創建它(因爲構造函數是公共的),但沒有人可以訪問靜態實例(因爲它和訪問器都是私有的)。這與你想要的相反。 – 2012-07-06 12:25:18

+0

我們可以使CTOR成爲靜態嗎? – 2012-07-06 12:27:34

回答

2

傳統的Singleton(反)模式不是靜態變量的集合;相反,它是具有非靜態成員的對象,其中只有一個實例可以存在。

在C++中,這可以避免靜態變量的最大問題:「初始化順序失敗」。由於初始化順序對於不同翻譯單元中的靜態變量沒有指定,所以有可能在初始化之前嘗試訪問另一個構造函數,從而給出未定義的行爲。但是,它引入了其他問題(類似的「破壞命令失敗」,以及舊版編譯器中的線程安全問題),所以它仍然是需要避免的。

如果你想靜態變量和函數的集合,然後把它們放到一個命名空間,而不是一類:

namespace stuff { 
    int a; 
    void do_something(); 
} 

如果你想你想一個單身,然後再思考;你通常會更好地避免全局訪問的對象。如果你仍然想一個,那麼你會做一類具有私有構造函數,並返回到單一實例的引用一個公共的訪問,沿着線:

class singleton { 
public: 
    singleton & get() { 
     static singleton instance; 
     return instance; 
    } 

    int a; 
    void do_something(); 

private: 
    singleton() {} 
    ~singleton() {} 
    singleton(singleton const &) = delete; 
}; 
3

我喜歡:

GlobalObjectMgr& GlobalObjectMgr::instance() 
{ 
    static GlobalObjectMgr objMgr; 
    return objMgr; 
} 

沒有所需的類成員變量,只在需要時創建它。

相關問題