b***i 发帖数: 3043 | 1 我们公司的项目中定义了和业务相关的类,比如Well, Workspace, 各类Model等。这些
类在系统中形成树形结构,所以每个成员都有Parent,为此,每个类都是一个基类的子
类,这个基类有Parent,是基类的指针。
现在出现了争论,就是拷贝构造函数是干嘛的。我认为,拷贝要拷贝所有的东西,是C+
+语法需要的。而架构师认为,拷贝是给用户复制一个树用的。
具体:
我认为,拷贝是为了C++编译器用的,当我们把一个语句编译的时候,编译器有的时候
需要调用我们的拷贝构造,有的时候需要调用移动赋值等。比如
auto temp = std::make_unique<...>(*it->get());这里就是调用拷贝构造
而各类的std::vector>里面如果删减则调用shared_ptr的move
assignment,或者copy assignment。这是应C++语法的要求。
架构师认为,用户复制一个树的时候,比如复制一个Well, 被复制的不能拥有同一个
Parent,不能指向同一个目录等。但为认为应该定义另一个函数用来复制,比如叫
Clone,来完成他的不完全复制。
大家怎么说? |
h**l 发帖数: 168 | 2 一般情况下copy constructor is copy by value.
对指针成员变量的处理是由你们的业务逻辑决定的,和C++语法无关。 |
b***i 发帖数: 3043 | 3 一个例子
vector all;
all.reserve(2);
all.push_back(1);// id = 1
all.push_back(2);// id = 2
all.erase(all.begin());//此时调用拷贝构造函数或者移动构造,但是我们的两个函
数不复制id,所以
all.begin()->showId();//显示0.因为我们的拷贝构造是给业务逻辑用的,不是给其他
库用的。但是这样这个vector存的东西都变了。
【在 h**l 的大作中提到】 : 一般情况下copy constructor is copy by value. : 对指针成员变量的处理是由你们的业务逻辑决定的,和C++语法无关。
|
r*****z 发帖数: 906 | 4 如果你们的类处于特定的原因,不愿意提供拷贝构造函数而希望要求用户使用clone这
样的方式,那么应该把拷贝构造函数deleted。这样,你上面的代码就根本不能编译了
。事实上,如果不提供拷贝构造函数的理由是充分的的话,这种限制(比如很多标准容
器相关的用法会不允许)也将是合理的。这不是语言问题。 |
h**l 发帖数: 168 | 5 你们自己的程序是在什么情况下调用拷贝构造函数的? 为什么你们的拷贝构造函数和
移动构造函数不复制id?指针成员变量的处理比较复杂一些,id应该是primitive type
, 为什么要特殊处理?
可能像楼上说的,你们这个类的对象就不适合被拷贝,直接disable掉,你们用你们自
己的函数来拷贝就好了。
【在 b***i 的大作中提到】 : 一个例子 : vector all; : all.reserve(2); : all.push_back(1);// id = 1 : all.push_back(2);// id = 2 : all.erase(all.begin());//此时调用拷贝构造函数或者移动构造,但是我们的两个函 : 数不复制id,所以 : all.begin()->showId();//显示0.因为我们的拷贝构造是给业务逻辑用的,不是给其他 : 库用的。但是这样这个vector存的东西都变了。
|
b***i 发帖数: 3043 | 6 我同意你的观点,好不容易劝说了几个人接受这个观点。
【在 r*****z 的大作中提到】 : 如果你们的类处于特定的原因,不愿意提供拷贝构造函数而希望要求用户使用clone这 : 样的方式,那么应该把拷贝构造函数deleted。这样,你上面的代码就根本不能编译了 : 。事实上,如果不提供拷贝构造函数的理由是充分的的话,这种限制(比如很多标准容 : 器相关的用法会不允许)也将是合理的。这不是语言问题。
|
b***i 发帖数: 3043 | 7 在需要半复制,半构造的时候,就是把一个树的结构复制,每个节点半复制(名字可以
一样,但是id不一样,父节点指针也不一样),所以不能复制id和父节点指针。
type
【在 h**l 的大作中提到】 : 你们自己的程序是在什么情况下调用拷贝构造函数的? 为什么你们的拷贝构造函数和 : 移动构造函数不复制id?指针成员变量的处理比较复杂一些,id应该是primitive type : , 为什么要特殊处理? : 可能像楼上说的,你们这个类的对象就不适合被拷贝,直接disable掉,你们用你们自 : 己的函数来拷贝就好了。
|