2011-07-12 32 views
5

有人可以證明需要在Singleton類實現中私有化賦值運算符嗎?需要在Singleton類中私有化賦值運算符

它通過使Singleton& operator=(Singleton const&);私人解決什麼問題?

class Singleton { 
public: 
    static Singleton& Instance() { 
    static Singleton theSingleton; 
    return theSingleton; 
    } 

private: 
    Singleton(); // ctor hidden 
    Singleton(Singleton const&); // copy ctor hidden 
    Singleton& operator=(Singleton const&); // assign op. hidden 
    ~Singleton(); // dtor hidden 
}; 

回答

10

分配在一個單身簡直是無稽之談操作,因爲只是其中的對象應該永遠存在。

使得賦值運算符私人有助於診斷廢話代碼如下所示:

Singleton& a = Singleton::Instance(); 
Singleton& b = Singleton::Instance(); 
a = b; // Oops, accidental assignment. 
+2

即使開發者做了a = b,我也能理解。因爲兩個對象都指向同一個Singleton的靜態實例,所以沒有任何傷害。所以私有化或轉讓經營者並不是一個單身人士如預期那樣行事的必要條件。 –

+1

@PrashanthGN這是正確的,這應該是一個無操作,所以'operator ='不是危險的,只是無稽之談。 –

2

只有一個單身人士。複製它是沒有意義的。您需要兩個副本才能保持健全,大多數複製操作員需要檢查self==&other以保證安全。

這個private詭計是黑客。 C++0x does it better.

開始咆哮......

恕我直言,一個Singleton是一種自相矛盾的說法。這是愚蠢的想法的產物,的一切必須是一個對象才能被封裝。這與Java的Math.sin(x)等人的頭腦一樣。

你的生活會更簡單,如果「單」僅僅是在一個命名空間一套免費的功能。任何單身人士的私人「成員」都可以隱藏在.cpp中的匿名命名空間中。實現了封裝,而且沒有繁瑣的額外語法。

MyNamespace :: foo(); 

代替

MyClass :: instance() .foo(); 
+0

雖然賦值運算符並不真正用於複製。 –

+0

但它調用構造函數。 – 3nixios

+0

'MyNamespace'中的函數可能仍然需要共享狀態,然後將其封裝在只有一個對象存在的對象中。後面是單身人士。它很少*有用,但有時* *實際上是有用的。當然,沒有必要堅持這個特殊的'Singleton'模式,這個狀態也可以通過返回靜態本地的特殊函數來管理。但這僅僅是一個句法上的區別。 –

0

當你使用一個單身的原因,你實現它,是因爲你只想要那個類的一個對象的一個​​實例。換句話說,不需要複製實例,因爲只能有一個實例。複製構造函數也是一樣的。

2

如果您只需要一個實例,則複製構造函數應該是私有的。賦值運算符訪問說明符無關緊要,因爲無論如何都無法使用。

0

我的理由是:如果只有一個實例可能是各地運營商=可以毫無問題地定義,因爲它不會做任何顯著。如果我們將其設置爲私有,編譯器將通過標記任何將該運算符用作錯誤的嘗試來增加一個安全級別。順便說一下,對於析構函數來說,同樣的推理也適用。

1

使得賦值運算符私人並沒有真正改變什麼, 因爲你需要兩個實例能夠分配。它確實符合人們期望看到的 ;通常如果 構造函數是私有的,那麼賦值操作符也是如此。聲明一個私人分配操作符 只是符合人們的期望。

0

繼承的boost ::在單類模式,而不是定義私有拷貝構造和賦值操作符不可複製(私人)。