2008-11-06 57 views
0

我有一個不太小的類正在開發中(它經常更改),我不需要提供公共的複製構造函數和複製指定。 該類具有值語義的對象,因此默認複製和分配工作。有一種方法來聲明覆制構造函數非公開和使用默認複製構造函數?

該類處於層次結構中,具有虛擬方法,所以我提供了一個虛擬Clone()以避免切片並執行「多態複製」。

我不想聲明覆制分配和構造受保護的AND來定義它們(並保持與變化同步),除非我有一些特殊的事情要執行。

有人知道是否有另一種方式嗎?

謝謝!

UgaSofT

+0

你很清楚。你想讓默認拷貝文件可供內部使用,但只是不公開正確? – 2008-11-06 16:09:28

+0

哎呀...這應該是「你不太清楚」。 – 2008-11-06 16:10:08

回答

3

來自多態層次結構的對象和值語義?這裏不對勁。

如果您確實需要您的類具有值語義,請查看J.Coplien的Envelop-Letter成語或本文中關於Regular Objects [1]的內容。

[1]肖恩家長。 「超越對象」。瞭解我們編寫的軟件。 http://stlab.adobe.com/wiki/index.php/Papers_and_Presentations。 C++連接。 11月2005.

HTH,

0

我不認爲這是在C++語言,允許你做這種事。儘管我很想在這一點上做錯。

我在過去遇到過這種情況,想出了以下解決方案。假定班級是C1。

  1. 定義一個名爲數據
  2. 私有內部類把我的會員我會在C1 delare上的數據,而不是
  3. 定義一個受保護的拷貝構造函數C1之間,僅僅拷貝數據實例。

這種方法有幾個缺點。即感覺有點不自然,並且消除了直接的字段訪問(可以通過小的訪問函數來緩解)。

這是一個迂迴的做你正在尋找的方式,但它避免了你必須手工編寫拷貝構造函數。

0

也許我已經找到了解決辦法...

我可以把我的根基類(或者我可以創建一個小的接口類,沒有數據成員,並執行多重繼承)這裏是空的受保護的拷貝構造函數。 我不重新定義派生類中的Copy ctor,當默認的那個沒關係。現在,客戶端無法訪問默認拷貝ctor(導致基座無法訪問),但默認工作!

有一些反對意見嗎?

0

如果你可以使用C++ 0x ...

class A 
{ 
    protected: 
     A(const A&) = default; 
};