我知道Qobject应该是标识而不是值,比如你不能复制它们,默认情况下,复制构造函数和赋值都是禁用的,正如qt文档中所解释的那样。但是,是否可以使用克隆方法从现有的QObject创建新的an呢?这会是一个逻辑错误吗?如果我说
QObject b;
QObject a;
b.cloneFrom(a);或
QObject a = new QOBject();
QObject b = new QOBject();
b->cloneFrom(a);而clone方法会复制像成员之类的东西,这是不是错了?
如果这样可以,我可以编写自己的复制构造函数和赋值运算符吗?
注意:我实际上想用继承qobject的类来尝试这一点。
发布于 2010-05-18 17:47:30
在我看来,克隆QObjects几乎总是在语义上被打破,并导致不想要的副作用,因为正如你已经说过的那样,它们有一个“身份”。因此,克隆打破了人们对QObjects的所有假设,比如它们的信号/插槽连接和动态属性。你应该考虑要克隆的对象是否真的需要QObjects,或者你想要克隆的“值部分”是否可以被分离出来。
而且,克隆只对QObjects的特定子类有意义,而对QObjects本身没有意义(它们没有真正的“类似值”属性)。
同样,A;B;A.cloneFrom( B)看起来是坏的,因为如果B是B的子类的实例而不是B本身,它就不起作用。克隆应该通过一个虚拟的B* B:: Clone ()常量来完成。
发布于 2010-05-18 17:46:43
我认为在这种情况下,最好的做法是使用您想要在QObjects之间复制的数据创建类。此类不应从QObject或任何从QObject派生的类派生。这个类将是“值容器”。在这种情况下,您应该能够以非常好的方式解决您的问题。
另一个提示:对于这个类,您可以使用隐式数据共享和写入时复制来减少不必要复制的开销:http://doc.qt.io/qt-5/implicit-sharing.html
https://stackoverflow.com/questions/2855495
复制相似问题