Я пытаюсь реализовать копирование и перемещение заданий, но не понимаю, как их использовать. Я прочитал следующую тему
Когда вызывался оператор копирования?
Но это не сработало для меня.
Учебный класс:
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;
};
Я хотел бы знать, когда называются назначение копирования и назначение перемещения. Заранее спасибо.
Я мой первый комментарий, я рекомендовал удалить все *
с и 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», но я думаю, что вы заинтересованы только в вызываемой функции, а не в том, что они делают.