2014-05-08 40 views
2

我有下一個錯誤,當我嘗試編譯我的代碼:錯誤:調用隱含缺失的拷貝構造函數「卡德納」

./usuario.h:64:37: error: call to implicitly-deleted copy constructor of 'Cadena' 
       Cadena direccion() const { return direccion_; } 
                ^~~~~~~~~~ 
./../P1/Cadena/cadena.h:11:3: note: copy constructor is implicitly deleted because 'Cadena' has a user-declared move constructor 
       Cadena(Cadena&& c); 
usuario.cpp:14:3: error: call to implicitly-deleted copy constructor of 'Cadena' 
     nombre_(nombre), apellidos_(apellidos), direccion_(direccion), password_(password){ 
     ^  ~~~~~~ 

在卡德納的構造器是:

Cadena(const size_t t=0, const char c=' '); 
Cadena(Cadena&& c); 
Cadena(const char* c); 

且移動構造函數:

Cadena::Cadena(Cadena&& c) : tam_(c.tam_) { 
    cadena_ = new char[tam_+1]; 
    strcpy(cadena_, c.cadena_);  
    c.tam_=0; 
    delete[] c.cadena_; 
    c.cadena_ = new char[1]; 
    c.cadena_ = ""; 
} 

usuario.h中的聲明是:

//........ 
public: 
    Cadena id() const { return id_; } 
//.... 
private: 
    Cadena direccion_; 

Cadena類完美地工作,但現在我需要使用它並且編譯器會刪除這些錯誤。 我認爲,我不這樣做沒有什麼特別的,僅返回/指定型卡德納..

的對象我期待你的反饋,

最誠摯的問候。

+0

該錯誤消息說明了一切,哪些部分是你遇到問題?你正在嘗試返回一個'Cadena'副本,由於錯誤信息中解釋的原因,這是不可能的。也許你需要提供一個複製構造函數,或者明確地默認一個? – Praetorian

+0

有效地,我刪除了複製構造函數,我相信移動構造函數與複製函數具有相同的功能。謝謝! –

+1

不,複製和移動是兩個非常不同的操作,複製時需要複製構造函數。你可以修改你的代碼,把違規行改成'Cadena direccion()const {return std :: move(direccion_); '',但這可能不是你想要的行爲。 – Praetorian

回答

3

只是爲了保持完整性,標準從你的編譯器警告強制要求的行爲:

12.8複製和移動類對象[class.copy]

7 If the class definition does not explicitly declare a copy constructor, one is declared implicitly. If the class definition declares a move constructor or move assignment operator, the implicitly declared copy constructor is defined as deleted; otherwise, it is defined as defaulted (8.4). The latter case is deprecated if the class has a user-declared copy assignment operator or a user-declared destructor.

所以如果你想複製行爲,將不得不自己提供一個拷貝構造函數和拷貝賦值操作符。

然而,看着你的移動構造函數,看起來這不提供任何移動語義,而是深層複製(提示:strcopy()做什麼?它肯定不會移動)。因此,我將重新命名當前的移動構造函數拷貝構造函數,並提供真正移動的新舉措構造函數(即重新分配char指針或無論是手柄的實際數據在您的類)。