我有一個不太小的類正在開發中(它經常更改),我不需要提供公共的複製構造函數和複製指定。 該類具有值語義的對象,因此默認複製和分配工作。有一種方法來聲明覆制構造函數非公開和使用默認複製構造函數?
該類處於層次結構中,具有虛擬方法,所以我提供了一個虛擬Clone()以避免切片並執行「多態複製」。
我不想聲明覆制分配和構造受保護的AND來定義它們(並保持與變化同步),除非我有一些特殊的事情要執行。
有人知道是否有另一種方式嗎?
謝謝!
UgaSofT
我有一個不太小的類正在開發中(它經常更改),我不需要提供公共的複製構造函數和複製指定。 該類具有值語義的對象,因此默認複製和分配工作。有一種方法來聲明覆制構造函數非公開和使用默認複製構造函數?
該類處於層次結構中,具有虛擬方法,所以我提供了一個虛擬Clone()以避免切片並執行「多態複製」。
我不想聲明覆制分配和構造受保護的AND來定義它們(並保持與變化同步),除非我有一些特殊的事情要執行。
有人知道是否有另一種方式嗎?
謝謝!
UgaSofT
來自多態層次結構的對象和值語義?這裏不對勁。
如果您確實需要您的類具有值語義,請查看J.Coplien的Envelop-Letter成語或本文中關於Regular Objects [1]的內容。
[1]肖恩家長。 「超越對象」。瞭解我們編寫的軟件。 http://stlab.adobe.com/wiki/index.php/Papers_and_Presentations。 C++連接。 11月2005.
HTH,
我不認爲這是在C++語言,允許你做這種事。儘管我很想在這一點上做錯。
我在過去遇到過這種情況,想出了以下解決方案。假定班級是C1。
這種方法有幾個缺點。即感覺有點不自然,並且消除了直接的字段訪問(可以通過小的訪問函數來緩解)。
這是一個迂迴的做你正在尋找的方式,但它避免了你必須手工編寫拷貝構造函數。
也許我已經找到了解決辦法...
我可以把我的根基類(或者我可以創建一個小的接口類,沒有數據成員,並執行多重繼承)這裏是空的受保護的拷貝構造函數。 我不重新定義派生類中的Copy ctor,當默認的那個沒關係。現在,客戶端無法訪問默認拷貝ctor(導致基座無法訪問),但默認工作!
有一些反對意見嗎?
如果你可以使用C++ 0x ...
class A
{
protected:
A(const A&) = default;
};
你很清楚。你想讓默認拷貝文件可供內部使用,但只是不公開正確? – 2008-11-06 16:09:28
哎呀...這應該是「你不太清楚」。 – 2008-11-06 16:10:08