我知道Qobjects应该是身份而不是值,例如你不能复制它们,默认情况下,复制构造函数和赋值被禁用,如qt文档中所述。但是可以使用克隆方法从现有的QObject创建新的QObject吗?这会是一个逻辑错误吗? 如果我说
QObject b;
QObject a;
b.cloneFrom(a);
或
QObject a = new QOBject();
QObject b = new QOBject();
b->cloneFrom(a);
并且克隆方法复制像成员之类的东西会是错的吗?
如果可以,我可以编写自己的复制构造函数和赋值运算符吗?
注意:我实际上想用继承qobject的类来尝试这个。
答案 0 :(得分:7)
在我看来,克隆QObjects几乎总是在语义上被打破并导致不必要的副作用,因为它们具有你已经说过的“身份”。因此,克隆打破了关于QObjects的所有假设,例如它们的信号/槽连接和动态属性。你应该考虑克隆的对象是否真的需要是QObjects,或者你想要克隆的“value-part”是否可以被考虑在内。
如果有的话,克隆只对QObject的特定子类有意义,而不适用于QObjects本身(它们没有真正的“类似值”属性)。
也是,A; B; A.cloneFrom(B)看起来很糟糕,因为如果B是B的子类而不是B本身的实例,它就不起作用。 克隆应该通过我所说的虚拟B * B :: clone()const来完成。
答案 1 :(得分:4)
我认为在这种情况下最好的做法是使用要在QObjects之间复制的数据创建类。此类不应从QObject或从QObject派生的任何类派生。而这个班级将是“价值容器”。在这种情况下,您应该能够以非常好的方式解决您的问题。
还有一个提示:对于这个类,您可以使用隐式数据共享和写入副本来减少不必要的复制开销:http://doc.qt.io/qt-5/implicit-sharing.html