C++ c++;未调用复制分配和移动分配

C++ c++;未调用复制分配和移动分配,c++,copy-assignment,move-assignment-operator,C++,Copy Assignment,Move Assignment Operator,我正在尝试执行复制和移动任务,但我不明白应该如何使用它们。我已阅读了以下主题 但这对我不起作用 类别: class Directory{ string name; public: Directory(string name):name(name) { } ~Directory() { cout << "Deleting was called" <<endl; }

我正在尝试执行复制和移动任务,但我不明白应该如何使用它们。我已阅读了以下主题

但这对我不起作用

类别:

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;
        }
};
类目录{
字符串名;
公众:
目录(字符串名称):名称(名称){
}
~Directory(){
cout可以这样尝试:

#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;
};

从这一点可以看出,您的副本分配是不正确的,因为它仍然打印“alex”,但我想您只对调用的函数感兴趣,而不关心它们的功能。

我的第一条评论是,我建议删除所有
*
新的

因此,主要功能变为:

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
}
编译

错误:目录dir2;
中出现错误

是的。您定义了构造函数
目录(字符串名称);
。这将禁止自动创建此处需要的默认构造函数

我们可以将默认构造函数添加到
类目录

  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;
}

您可以在现场看到它。

指针的赋值已完成(
目录*
)在您的情况下,删除
*
新的
就可以了。如果您使用指针,您希望如何调用copy???
dir=dir2;
调用内置指针复制赋值操作符,而不是类复制赋值操作符。顺便说一句。
dir2
未初始化。因此,在
dir=dir2;之后de>
dir
具有相同的值,指向
新的
ed实例的指针丢失。这是内存泄漏。使用deleted函数:您必须定义一个复制构造函数。我总是不太确定何时自动定义复制构造函数,而何时不自动定义。但实际上,最好遵循以下步骤。(因此,我不知道,因为我不需要知道。)谢谢你的努力。它真的很有效。我正试图从这个例子中学习。我不明白为什么你的代码有效,而我的代码无效。编辑后,主要部分是一样的。@AlexLavriv-你是否像我一样添加了副本构造函数?@AlexLavriv-这个链接可能对你很有意思:我现在添加了它。它有效。但它对我们没有帮助出于某种原因,移动分配要求提供复制构造函数。这是一种非常奇怪的行为。@AlexLavriv-不涉及移动分配。这是一种优化,省去了临时(即
目录(“alex”);
)。
  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;
}