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