c++ - QScopedpointer 在 Q_DISABLE_COPY 失败

标签 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)
                    ^

复制发生的原因和地点?

最佳答案

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

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

这是一个 QScopedPointer<CalculationManager> 类型的临时对象构建然后复制到calculationManager数据成员。
您可以这样做以避免额外的拷贝:

calculationManager(new CalculationManager())

它将调用需要指向 CalculationManager 指针的构造函数并且不会发生复制。

关于c++ - QScopedpointer 在 Q_DISABLE_COPY 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39280245/

相关文章:

c++ - 为什么复制构造函数调用其他类的默认构造函数?

c++ - 初始化全局变量的问题

c++ - GetProcAddress 和函数指针 - 这是正确的吗?

c++ - 颜色检测中打开 cvtColor 速度太慢

C++ 等价于 Java 的 toString?

c++ - 当信号再次触发时第二次调用从 Qt Slot 执行的函数时会发生什么?

windows - QProcess 无法执行外部可执行文件

c++ - 复制初始化的奇怪行为,不调用复制构造函数!

c++ - C++中的复制构造函数

.net - QT4 与 .Net 相比如何