3

コードをコンパイルしようとすると、次のエラーが発生します。

./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 のコンストラクターは次のとおりです。

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型のオブジェクトを返す/割り当てるだけです..

あなたのフィードバックを期待しています。

よろしくお願いします。

4

1 に答える 1

4

完全を期すために、標準はコンパイラの警告からの動作を義務付けています。

12.8 クラスオブジェクトのコピーと移動 [class.copy]

7 クラス定義でコピー コンストラクターが明示的に宣言されていない場合は、暗黙的に宣言されます。クラス定義でムーブ コンストラクターまたはムーブ代入演算子が宣言されている場合、暗黙的に宣言されたコピー コンストラクターは削除済みとして定義されます。それ以外の場合は、デフォルトとして定義されます (8.4)。クラスにユーザー宣言のコピー代入演算子またはユーザー宣言のデストラクタがある場合、後者のケースは推奨されません。

したがって、コピー動作が必要な場合は、コピー コンストラクターとコピー代入演算子を自分で提供する必要があります。

ただし、移動コンストラクターを見ると、これは移動セマンティクスを提供するのではなく、ディープ コピーを提供するように見えます (ヒント: 何が機能strcopy()しますか? それは確かに移動しません)。したがって、現在の移動コンストラクターの名前をコピー コンストラクターに変更し、実際に移動する新しい移動コンストラクターを提供します (つまり、charポインターまたはクラス内の実際のデータへのハンドルを再割り当てします)。

于 2014-05-08T20:12:19.353 に答える