2010-03-19 24 views
1

我有一個Shape類包含潛在的許多頂點,我正在考慮使私人複製構造/複製分配,以防止意外的不必要的複製我的重量級類(例如,通過值而不是通過引用傳遞)。通常使重量級課程不可複製是否是良好的做法?

要製作一個Shape的副本,人們必須故意調用「克隆」或「重複」方法。

這是一個很好的做法嗎?我想知道爲什麼STL容器不使用這種方法,因爲我很少想通過它們來傳遞它們。

回答

7

限制您的用戶並不總是一個好主意。只記錄複製可能花費很多就足夠了。如果用戶真的想要複製,那麼通過提供複製構造函數來使用C++的本地語法是一種更簡潔的方法。

因此,我認爲真正的答案取決於上下文。也許你寫的真正的課程(不是想象中的形狀)不應該被複制,也許它應該。但作爲一般方法,我當然不能說用戶不應該通過強制他們使用顯式的方法調用來阻止用戶複製大對象。

2

根據您的需求...

如果你想確保副本不會在無意中發生,並製作一份拷貝會導致嚴重的瓶頸或根本沒有意義,那麼這是良好的做法。編譯錯誤優於性能調查。

如果您不確定您的班級將如何使用,並且不確定這是不是一個好主意,那麼這不是一個好習慣。大多數時候你不會以這種方式限制你的課程。

4

恕我直言,提供一個拷貝構造函數和賦值操作符,或者不依賴於你的類所建模的東西多於拷貝的代價。

如果你的類代表,即如果傳遞一個對象或對象的副本不有所作爲,然後爲他們提供(並提供平等的經營者也)

如果你的類ISN那就是說,如果你認爲這個階級的對象有一個身份和一個國家(其中一個也說實體),那麼不要。如果副本有意義,請提供克隆或複製成員。

有時候你不能輕易分類的課程。集裝箱就在那個位置。它意味着將它們視爲實體並僅通過引用傳遞它們,並在需要時進行特殊操作以製作副本。你也可以把它們看作是價值的聚合,所以複製是有道理的。 STL是圍繞值類型設計的。因爲一切都是價值,容器是如此的合理。這允許諸如map<int, list<> >這些有用的東西。 (請記住,您不能將可複製的類放入STL容器中)。

4

一般來說,你不會因爲它們很重而讓類不可複製(你已經展示了一個很好的例子STL)。

你讓他們不可複製的,當他們連接到像插座,文件,鎖定一些不可複製的資源或他們不設計在所有被複制(例如具有可深可幾乎複製了一些內部結構)。

但是,在你的情況下,你的對象是可複製的,所以請留下它。

關於clone()的小注 - 它用作多態拷貝構造函數 - 它具有不同的含義和用法。

4

大多數程序員已經意識到複製各種對象的成本,並知道如何避免使用諸如傳遞引用等技術的副本。

注意STL的矢量,字符串,地圖,列表等都可以被認爲是「重量級」對象(特別是像10000個元素的矢量!)。這些類仍然提供複製構造函數和賦值運算符,因此如果您知道自己在做什麼(如創建一個std ::向量列表),則可以在必要時複製它們。

因此,如果它很有用,請提供它們,但一定要記錄它們是昂貴的操作。

+0

我喜歡STL容器的例子。 – 2010-03-19 16:51:55

相關問題