2011-03-04 19 views
5

我有一個單獨的方法,但我在哪裏初始化類成員,如果它的構造函數是私人的?如何以單例模式初始化類成員?

class MyClass 
{ 
    MyClass() {};    //constructor is private   
    MyClass(const MyClass&);    
    MyClass& operator=(const MyClass&); 
public: 
    static MyClass& Instance() 
    { 
     static MyClass singleton; 
     return singleton; 
    } 
}; 
+1

爲什麼在構造函數中會出現問題?實例是類的成員,不應該有調用構造函數的問題。 – DumbCoder 2011-03-04 18:04:56

回答

12

您可以像平常一樣在構造函數中初始化類成員,即使是私有的。

構造函數是私人到外面的世界,的靜態成員函數Instance()。這意味着,static MyClass singletonInstance()實際上調用默認的構造函數,並且這是有效的,因爲Instance()有權訪問private類的成員!

3

在構造函數中,這就是它的用途。它可以完全訪問會員。

另外,請注意,這在多線程應用程序中是不安全的。

+0

不安全是高度依賴於系統。 – 2011-03-04 18:12:44

0

Your Instance方法調用構造函數。 Instance方法是靜態的,所以你可以在不構建它的情況下訪問它,因爲它是一個成員,它可以調用私有構造函數。

然後,你的構造函數可以做任何必要的初始化。

順便說一句,你的單身成員應該是一個指針。

+0

如果成員是一個指針,如果它是一個方法內部的靜態,我認爲它不重要。即使它是該類的靜態成員,但應該沒問題(儘管您在懶惰初始化時失去了一個機會),除非我錯過了某些東西。 – mkb 2011-03-04 18:12:36

+1

這種特殊的風格被稱爲邁爾的單身人士,它被引入「更有效的C++」(第26項)。 – 2011-03-04 18:17:14

+0

它可能是一個const指針,而不是參考返回? – user963241 2011-03-04 18:24:05