当我尝试编译代码时,我有下一个错误:
./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课程完美无缺,但现在我需要使用它,编译器会丢弃这些错误。 我认为我没有做任何特别的事情,只返回/分配一个Cadena类型的对象..
我希望你的反馈,
最好的问候。答案 0 :(得分:3)
为了完整起见,标准规定了编译器警告的行为:
12.8复制和移动类对象[class.copy]
7如果课程定义没有明确声明副本 构造函数,一个是隐式声明的。 如果课程定义 声明一个移动构造函数或移动赋值运算符 隐式声明的复制构造函数被定义为已删除; 否则, 它被定义为默认值(8.4)。后一种情况如果被弃用则弃用 class具有用户声明的复制赋值运算符或用户声明的 析构函数。
因此,如果您想要复制行为,则必须自己提供复制构造函数和复制赋值运算符。
然而,看看你的移动构造函数,似乎这不提供任何移动语义,而是提供深度复制(提示:strcopy()
做什么?它肯定不会移动)。所以我会将你当前的移动构造函数重命名为复制构造函数,并提供一个实际移动的新移动构造函数(即重新分配char
指针或任何句柄到你的类中的实际数据。) p>