傳統的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;
};
這不是一個實現。它對此一無所知。 – Nawaz 2012-07-06 12:24:07
正如所寫,任何人都可以創建它(因爲構造函數是公共的),但沒有人可以訪問靜態實例(因爲它和訪問器都是私有的)。這與你想要的相反。 – 2012-07-06 12:25:18
我們可以使CTOR成爲靜態嗎? – 2012-07-06 12:27:34