2010-05-18 121 views
5

我知道Qobjects应该是身份而不是值,例如,您不能复制它们,默认情况下,复制构造函数和赋值被禁用,如qt文档中所述。但是有可能使用克隆方法从现有的QObject创建一个新的QObject?这会是一个逻辑错误吗? 如果我说QObject克隆

QObject b; 
QObject a; 
b.cloneFrom(a); 

QObject a = new QOBject(); 
QObject b = new QOBject(); 
b->cloneFrom(a); 

和克隆方法复制的东西一样成员等会这样错了吗?

如果这是好的我可以写我自己的拷贝构造函数和赋值操作符吗?

注意:我实际上想用继承qobject的类来试试这个。

+0

这也会克隆连接没有?恕我直言,你的代码有什么问题......你可以用POD结构重新做这件事吗? – elcuco 2010-05-18 08:22:06

+0

不,不需要克隆只是在对象中设置的数据成员(主要是由继承层添加的数据成员)。 – Olorin 2010-05-18 08:28:46

回答

7
在我看来克隆的QObject

几乎总是语义破裂,导致不必要的副作用,因为他们有一个“身份”,正如你已经说过的。因此,克隆打破了QObject的所有假设,比如它们的信号/插槽连接和动态属性。您应该考虑克隆的对象是否真的需要QObject,或者您想克隆的“数值部分”是否可以分解出来。

而且,如果有的话,克隆只对QObject的特定子类有意义,而不适用于QObjects本身(它们没有真正的“类似于值的”属性)。另外,A;

也,A; B; A.cloneFrom(B)看起来破损,因为如果B是B的一个子类的实例而不是B本身,则它不起作用。 克隆应该通过一个虚拟的B * B :: clone()const来完成。

+3

我必须补充一点,一个常见的设计错误是将所有东西都做成QObject,而不是在做之前先考虑两次。我只在必要时制作QObjects,即适用“身份”模式的地方,我需要信号/插槽等。 – 2010-05-18 09:49:14

+0

完全同意弗兰克。即使Qt本身也包含很多不是从QObject派生的类。所有值容器如QString,QList,QDomNode ...它们不是从QObject派生的。 – VestniK 2010-05-18 10:17:26

+0

我不好当我写代码给我QObject作为一个例子增值业务实际上并不是qobject类型,但派生类型的代码应该是MyClass a,b; b.cloneFrom(a);但我认为 我会考虑使用不是从qobject派生的类 – Olorin 2010-05-18 14:17:45

4

我认为在这种情况下最好的做法是用你想在QObject之间复制的数据创建类。这个类不应该从QObject或派生自QObject的任何类派生。而这个班级将是“价值容器”。在这种情况下,您应该能够以非常好的方式解决您的问题。

一个提示:对于这个类,你可以使用隐式数据共享与写时复制,以减少不必要的复制开销:http://doc.qt.io/qt-5/implicit-sharing.html