2013-05-17 40 views
1
Node*Clone(){ 
    numClones++;  
    Node*cloned=new Node(*this); 
    return cloned; 
} 

我有一個默認的構造函數(沒有參數)和我沒有宣佈的拷貝構造函數,所以我希望這個簡單的全部內容複製的*this的內存,並返回一個指向它。什麼是正確的方式來返回自己在你自己的副本?

不過,我得到錯誤的new線之上:

Call to implicitly deleted copy constructor

兩個可能的問題,但我不認爲他們應該影響這樣的:

  • thisunique_ptr連着到它。這是它包含一個unique_ptr的容器,它本身存儲在另一個unique_ptr容器中。但我不移動那個指針,我正在創建new對象沒有附加到先前的對象,對吧?
  • this實際上是Node一個子類,但我想一個指針,我真的建議你實現一個拷貝構造函數返回一個基類
+2

unique_ptr不能被複制構造,因此不生成Node類的拷貝,你必須手寫一個。查看Node類的定義會很有用。你有沒有試過「新的<此類型>(* this)」? – Akanksh

+0

你的意思是「附在它上面?」它是否保存在'unique_ptr'中,或者該類是否具有'unique_ptr'成員?後者防止產生隱式拷貝,因爲'unique_ptr'是不可複製的。 – Angew

+0

@Akanksh:你是怎麼知道「這有一個unique_ptr連接到它」的意思? –

回答

2

正如Jeffrey所說,std::unique_ptr不能被複制。您的Clone方法在邏輯上不正確。因爲你正在實例化一個Node對象 - 一個基類。所以它不會是真正

副本作爲解決方案,您可以在基類中聲明Clone方法,並在純虛:

class Node 
{ 
    virtual Node * Clone() const = 0; 
} 

,讓你的子類實現它

PS:不要忘記在接口virtualprotected dtor

+0

我也建議爲這個「接口」聲明一個默認的虛擬析構函數,否則可能有一個對象沒有被銷燬的問題。 – 2013-05-17 15:20:09

+0

@VladLazarenko:謝謝,補充 – Andrew

0

該問題是由於您嘗試複製構造std::unique_ptr(通過複製Node)而導致的,其定義爲does not have複製構造函數。

您可能打算使用std::shared_ptr

1

錯誤消息「調用隱式刪除的拷貝構造函數」表示您的類,其基類之一和/或該類或其任何基類的某些數據成員被聲明爲不可複製(或被編譯器視爲不可複製,例如,當至少有一個數據成員是reference)。因此,編譯器無法提供您正在嘗試調用的「默認」拷貝構造函數new Node(*this);

在這種情況下,正確的方法是實際查找哪些對象完全不可複製,並使它們可複製,以便編譯器可以創建一個隱式定義的拷貝構造函數,或者實現你自己的「拷貝邏輯」而不使用拷貝構造函數。

另一種選擇是使用某種「智能」指針指針(即std::shared_ptr)。但在這種情況下,您會得到shallow copy而不是deep copy

+0

在C++中,您應該努力將您的自定義複製邏輯**放入**(自定義)複製ctor中,而不是「不使用」它。 – Angew

+0

@Angew:同意,儘管它可能並不總是可能的。所以你應該努力,但作爲最後的手段... – 2013-05-17 15:15:46