2012-03-05 21 views
0

這個問題是相當fundamental.I給我cygwin的一個簡單而straighfoward測試:單和經典構造

class Example { 
    public: 
     Example(){ cout<<"dude..."<<endl; } 
     ~Example(){ cout<<"see ya"<<endl; } 
    public: 
     static Example *GetInstance(){ 
     if(m_instance==NULL){ 
      m_instance = new Example(); 
      cout<<"watch out bro"<<endl; 
     } 
     return m_instance; 
     } 
    public: 
     void exp(){cout<<"greetings"<<endl;} 
    private: 
     static Example *m_instance; 
}; 
int main(){ 
    Example a; 
    return 0; 
    } 

顯然,輸出爲:

dude... 
greetings 
see ya 

技術上單和典型的構造是在C++編程中有很多不同的故事,因爲singleton將構造函數設置爲私有,而典型的方式則相反。在我最近的實習體驗中,我注意到大多數編程人員以這種方式實現API。

我只是想知道這是否是這種情況,或者當兩種類構建方法並行存在時都是不必要的。

UPDATE

是構造&單在一個程序幾乎廢話的Cuz在此範圍內的單身現有的東西會成爲像unhazardous垃圾無用的代碼?

摘要 這是一個非常扯淡的問題... 更糟糕的是,感謝所有的你brilliants 構造函數和Singleton設計模式是「互斥」,並在vulnerbility而言,它是與全局變量相同的故事會影響我們的調試時間...

+1

A「單身」的對象,可以有兄弟姐妹(如本例中)僅僅是一個全局變量,所有的注意缺點。 – MSalters 2012-03-05 09:05:47

回答

2

通過使用Example public的構造函數,您可以讓您的類的用戶直接創建實例。如果你的設計只需要你的單例的一個實例,那麼這會讓用戶無意中顛覆這個需求。如果您已將構造函數設置爲private,那麼調用GetInstance()將是創建Example對象的唯一方法,從而強制要求僅允許創建一個實例。

請注意,靜態對象以與創建它們相反的順序銷燬。如果對象相互引用,則會導致問題。這是人們維護你的代碼的陷阱,如果你有很多這樣的對象,這很快就變得難以管理。

許多開發者認爲單身是一件壞事就像全局變量:

https://sites.google.com/site/steveyegge2/singleton-considered-stupid

0

我認爲你錯過了單身人士的整個概念。 Singleton意味着只有一個實例,但公共構造函數可以構造很多對象。

+0

在一個程序中是否存在兩種方式存在的可能性?我看過很多代碼是以這種方式寫的,所以這就是我所說的 – jasonkim 2012-03-05 08:54:32

+0

你是指公共構造函數+在一個對象上的「單一模式」?或一些對象作爲單身人士,有些則與普通人一樣? – nothrow 2012-03-05 08:55:57

+1

@ y26jin,當然它們可以存在於一個程序中,但是模式被破壞了。 – neciu 2012-03-05 08:56:49

1

當使用Singleton設計模式時,您總是應該使構造函數(複製構造函數)以及operator = private,以確保只有給定類的一個實例。否則,Singleton模式沒有多大意義。

0

我認爲這個例子已經壞了。它允許用戶創建多個「單身人士」,然後顯然他們不是單身人士。

單身構造函數必須是私有的。

0

只是使構造函數私人不會使類Singleton。爲此,在調用構造函數之前,必須確保內存中沒有其他實例存在。即使構造函數是私有的,也可以通過靜態類成員創建該類的任意數量的實例。

0

單例是一種確保創建的類只有一個實例的技術。通過公開構造函數,你顯然爲多個實例打開了大門,因此你的類可能不會被稱爲單例。

但是它仍然有一個靜態的GetInstance()方法,它作爲一個單例接口有點期待,這會讓人很難理解誰沒有寫代碼(甚至在一段時間之後寫給作者)。