我将QScopedPointer
用于从QObject
派生的类。
MainWindow
包含它:
private:
QScopedPointer<CalculationManager> calculationManager;
在构造函数中,这会失败:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
calculationManager(QScopedPointer<CalculationManager>(new CalculationManager()))
在qscopedpointer.h
:
Q_DISABLE_COPY(QScopedPointer)
使用:
C:\Qt\5.7\mingw53_32\include/QtCore/qscopedpointer.h: In constructor 'MainWindow::MainWindow(QWidget*)':
C:\Qt\5.7\mingw53_32\include/QtCore/qscopedpointer.h:176:20: error: 'QScopedPointer<T, Cleanup>::QScopedPointer(const QScopedPointer<T, Cleanup>&) [with T = CalculationManager; Cleanup = QScopedPointerDeleter<CalculationManager>]' is private
Q_DISABLE_COPY(QScopedPointer)
^
副本的原因和地点在哪里?
答案 0 :(得分:3)
QScopedPointer
没有移动构造函数
因此,如果你考虑这一行:
calculationManager(QScopedPointer<CalculationManager>(new CalculationManager()))
此处构建QScopedPointer<CalculationManager>
类型的临时对象,然后将其复制到calculationManager
数据成员。
您可以这样做以避免额外的副本:
calculationManager(new CalculationManager())
它将调用期望指向CalculationManager
的构造函数,并且不会发生任何副本。