2014-05-08 7 views
2

j'ai les prochaines erreurs quand je tente de compiler mon code:erreur: appel au constructeur de copie implicitement supprimé de « Cadena »

./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){ 
     ^  ~~~~~~ 

Les constructeurs Cadena sont:

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

Et le mouvement constructeur:

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_ = ""; 
} 

La déclaration usuario.h sont:

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

La classe Cadena est un travail parfaitement, mais maintenant je dois l'utiliser et le compilateur laisser tomber ces erreurs. Je pense que je ne pas faire rien de spécial, le retour seulement/assigner un objet de type Cadena ..

Je pense à vous des commentaires,

meilleures salutations.

+0

Ce message d'erreur explique tout, quel problème rencontrez-vous? Vous essayez de renvoyer une copie de 'Cadena', ce qui n'est pas possible en raison de la raison expliquée dans le message d'erreur. Peut-être que vous avez besoin de fournir un constructeur de copie, ou explicitement par défaut? – Praetorian

+0

effectivement, je supprime le constructeur de copie et je croyais que le constructeur de mouvement avait la même fonction que la copie. Merci! –

+1

Nope, la copie et le déplacement sont deux opérations très distinctes, et vous avez besoin du constructeur de copie lors de la copie. Vous pouvez corriger votre code en changeant la ligne fautive en 'direna() constena {) const {return std :: move (direccion_); } ', mais ce n'est probablement pas le comportement que vous voulez. – Praetorian

Répondre

3

Juste pour être complet, la norme mandate le comportement de votre avertissement du compilateur:

12,8 copie et objets de classe en mouvement [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.

Donc, si vous voulez copier le comportement, vous devra fournir un constructeur de copie et un opérateur d'affectation de copie vous-même. Cependant, en regardant votre constructeur de mouvement, il semble que cela ne fournisse pas de sémantique de déplacement, mais plutôt une copie profonde (indice: que fait strcopy()? Je renommerais donc votre constructeur de mouvement actuel pour le constructeur de copie, et fournirais un nouveau constructeur de déplacement qui se déplace réellement (c'est-à-dire ré-affecte le pointeur char ou quel que soit le handle aux données réelles de votre classe).

Questions connexes