Назначение копирования C++ и перемещение не вызывается

Я пытаюсь реализовать копирование и перемещение заданий, но не понимаю, как их использовать. Я прочитал следующую тему
Когда вызывался оператор копирования?
Но это не сработало для меня.

Учебный класс:

class Directory{

    string name;
public:
        Directory(string name):name(name) {

        }
        ~Directory() {
            cout << "Deleting was called" <<endl;

            }

        Directory& operator=(Directory& other){
            cout << "cp assigment" <<endl;
            return *this;
        }
        Directory& operator=(Directory&& other){
            cout << "move assigment" <<endl;
            return *this;
        }
};

Главный

int main()
{

    Directory* dir = new Directory("alex");
    Directory* dir2;
    dir = dir2;

    cout<<"done"<<endl;
};

Я хотел бы знать, когда называются назначение копирования и назначение перемещения. Заранее спасибо.

2 ответа

Решение

Я мой первый комментарий, я рекомендовал удалить все *с и new,

Следовательно, основной функцией становится:

int main()
{
  Directory dir = Directory("alex");
  Directory dir2;
  dir2 = dir; // <-- fixed, original was: dir = dir2;

  cout<<"done"<<endl;
  return 0; // <-- fixed, return is strictly recommended for every non-void function
}

Компиляция...

Ошибка: что-то не так в Directory dir = Directory("alex"); (использование конструктора удаленных копий).

Конструктор копирования используется для инициализации dir с временным экземпляром, созданным Directory("alex"),

Это легко изменить:

int main()
{
  Directory dir("alex"); // <-- fixed: direct construction
  Directory dir2;
  dir2 = dir;

  cout<<"done"<<endl;
  return 0;
}

Компиляция...

Ошибка: что-то не так в Directory dir2;,

Yepp. Вы определили конструктор Directory(string name);, Это подавляет автоматическое создание конструктора по умолчанию, который здесь необходим.

Мы могли бы добавить конструктор по умолчанию в class Directory:

  Directory() = default;

или мы можем улучшить существующий конструктор не по умолчанию, чтобы он также мог использоваться в качестве конструктора по умолчанию:

  Directory(string name = string()): name(name) { }

Весь источник:

#include <iostream>
#include <string>
using namespace std;

class Directory{

    string name;
public:
        Directory(string name = string()):name(name) {

        }
        ~Directory() {
            cout << "Deleting was called" <<endl;

            }

        Directory& operator=(Directory& other){
            cout << "cp assigment" <<endl;
            return *this;
        }
        Directory& operator=(Directory&& other){
            cout << "move assigment" <<endl;
            return *this;
        }
};

int main() {
    //Directory dir = Directory("alex");
    Directory dir("alex");
    Directory dir2;
    dir2 = dir;

    cout<<"done"<<endl;
    // your code goes here
    return 0;
}

Теперь он компилируется и работает.

Выход:

cp assigment
done
Deleting was called
Deleting was called

Вы можете увидеть это в прямом эфире на Ideone.

Может быть, попробуйте так:

#include <iostream>
#include <string>

using namespace std;

class Directory{
public:
       string name;

        Directory() {
            cout << "Constructor 1 was called" <<endl;            
        }

        Directory(string name):name(name) {
            cout << "Constructor 2 was called" <<endl;            
        }

        ~Directory() {
            cout << "Deleting was called" <<endl;
        }

        Directory(const Directory& other){
            cout << "cp cons" <<endl;
        }

        Directory& operator=(const Directory& other){
            cout << "cp assigment" <<endl;
            return *this;
        }

        Directory& operator=(Directory&& other){
            cout << "move assigment" <<endl;
            return *this;
        }
};


int main()
{

    Directory dir = Directory("alex");
    Directory dir2;
    dir2 = dir;

    cout << "done " << dir.name << dir2.name << endl;
};

Я изменил код, чтобы он не использовал указатели, добавил дополнительные конструкторы (обратите внимание на конструктор копирования) и добавил дополнительную печать.

Я получаю этот вывод:

Constructor 2 was called
Constructor 1 was called
cp assigment
done alex
Deleting was called
Deleting was called

Из этого вы можете видеть, что ваше назначение копирования неверно, поскольку оно по-прежнему печатает "alex", но я думаю, что вы заинтересованы только в вызываемой функции, а не в том, что они делают.

Другие вопросы по тегам