QSISped_COPY的QScopedpointer失败

时间:2016-09-01 20:19:32

标签: c++ qt copy-constructor

我将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)
                    ^

副本的原因和地点在哪里?

1 个答案:

答案 0 :(得分:3)

QScopedPointer没有移动构造函数 因此,如果你考虑这一行:

calculationManager(QScopedPointer<CalculationManager>(new CalculationManager()))

此处构建QScopedPointer<CalculationManager>类型的临时对象,然后将其复制到calculationManager数据成员。
您可以这样做以避免额外的副本:

calculationManager(new CalculationManager())

它将调用期望指向CalculationManager的构造函数,并且不会发生任何副本。