我有一个CPP程序,我在其中创建一个本地对象A,并希望将其存储在全局对象B中,这是一个QList。
是静态分配对象A还是需要使用 new 关键字。 QList是否使用复制构造函数?
由于
答案 0 :(得分:4)
QList存储对象的副本,因此它应该可以工作。但请确保复制确实是您想要的。如果不是这种情况,请使用new
分配对象并将指针存储在QList中。
答案 1 :(得分:0)
没有。内部范围变量不应存储在外部范围的变量中。您可以存储值,但不能存储该变量的引用/指针。
答案 2 :(得分:0)
QList只有一个指向它内容的指针。因此,无论何时制作QList的副本,它实际上并不复制所有内容,它只是复制指针。无论何时修改列表,都会进行复制以确保它不会修改其他对象的内容。请参阅:http://doc.qt.nokia.com/4.7-snapshot/qshareddatapointer.html
QList确实使用了复制构造函数,因此如果你的对象包含大量数据,那么在QList中使用直接对象可能并不好,因为当列表需要增长时,复制会导致一些开销。
另一个解决方案是使用QSharedDataPointer创建类似于QList的功能。
请注意,大多数Qt类已经使用了它,所以如果你的类包含这里列出的东西:http://doc.qt.nokia.com/4.7-snapshot/implicit-sharing.html使用QSharedDataPointer有点不必要。
我认为有一件事你没有明确表示有相关性。您是否希望全局静态对象A与列表中的对象具有相同的数据?
这可以通过使用指针或QExplicitlySharedDataPointer来实现。
QExplicitlySharedDataPointer与QSharedDataPointer非常相似,只有一个例外。 它在修改时不会复制数据。这是一些文档http://doc.qt.nokia.com/4.7-snapshot/qexplicitlyshareddatapointer.html
我经常使用这些类,我发现它们非常有用,并且根本不用。
答案 3 :(得分:-2)
没了。 QList存储指向对象的指针列表,因此不应将局部变量存储在全局QList中。
查看此链接了解详情: