7

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

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

或者

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

并且克隆方法会复制成员等内容,这是错误的吗?

如果可以,我可以编写自己的复制构造函数和赋值运算符吗?

注意:我实际上想尝试使用继承 qobject 的类。

4

2 回答 2

8

在我看来,克隆 QObjects 几乎总是在语义上被破坏并导致不必要的副作用,因为它们具有您已经说过的“身份”。因此,克隆打破了人们对 QObjects 的所有假设,例如它们的信号/插槽连接和动态属性。您应该考虑要克隆的对象是否真的需要是 QObjects,或者您想要克隆的“值部分”是否可以被分解。

如果有的话,克隆只对您特定的 QObjects 子类有意义,而不是对 QObjects 本身(没有真正的“类似值”的属性)。

亦是; 乙; A.cloneFrom( B ) 看起来坏了,因为如果 B 是 B 的子类而不是 B 本身的实例,它就不起作用。克隆应该通过虚拟 B* B::clone() const 我会说。

于 2010-05-18T09:47:30.400 回答
6

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

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

于 2010-05-18T09:46:43.023 回答