QScopedpointer在Q_DISABLE_COPY处失败

QScopedpointer fails at Q_DISABLE_COPY

本文关键字:失败 COPY DISABLE QScopedpointer      更新时间:2023-10-16

我使用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:Qt5.7mingw53_32include/QtCore/qscopedpointer.h: In constructor 'MainWindow::MainWindow(QWidget*)':
C:Qt5.7mingw53_32include/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)
                    ^

为什么和在哪里复制发生?

QScopedPointer没有move构造函数。
正因为如此,如果你考虑这一行:

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

这里构造了一个QScopedPointer<CalculationManager>类型的临时对象,然后将其复制到calculationManager数据成员。您可以这样做以避免额外的复制:

calculationManager(new CalculationManager())

它将调用构造函数,该构造函数需要一个指向CalculationManager的指针,并且不会进行复制。