<QtClassHelperMacros> 代理页面

宏文档

Q_DISABLE_COPY()

禁用给定 的拷贝构造函数和赋值运算符。

QObject 的子类的实例不应被视为可拷贝或可赋值的值,而应视为独特的标识。这意味着当你创建你自己的 QObject 子类(直接或间接)时,你不应该 给它一个拷贝构造函数或赋值运算符。然而,仅从你的类中省略它们可能不够,因为如果你错误地编写了需要拷贝构造函数或赋值运算符的代码(这样做很容易),编译器会细致地为你创建它。你必须做更多。

好奇的用户会看到,从 QObject 衍生的 Qt 类通常在这个宏的私有部分中包含这段代码

class MyClass : public QObject
{
private:
    Q_DISABLE_COPY(MyClass)
};

它在私有部分中声明了一个拷贝构造函数和一个赋值运算符,因此如果你不小心使用了它们,编译器会报告错误。

class MyClass : public QObject
{
private:
    MyClass(const MyClass &) = delete;
    MyClass &operator=(const MyClass &) = delete;
};

但是,这也许不能捕获所有情况。你可能想尝试以下操作

首先,不要这么做。大多数编译器将生成使用拷贝构造函数的代码,所以隐私违规错误会被报告,但你的 C++ 编译器不需要以特定的方式生成此语句的代码。它可能既不使用我们设为私有的拷贝构造函数也不使用赋值运算符。在这种情况下,不会报告任何错误,但当你调用成员函数 w 时,你的应用程序可能崩溃。

另请参阅Q_DISABLE_COPY_MOVE

Q_DISABLE_COPY_MOVE()

一个方便的宏,用于禁用给定 的拷贝构造函数、赋值运算符、移动构造函数和移动赋值运算符的使用。

另请参阅Q_DISABLE_COPY

© 2024 The Qt Company Ltd. 本文件中包含的文档贡献是该各自所有者的版权。本文件所提供的文档是根据自由软件基金会发布的 GNU 自由文档许可版本 1.3 许可的。Qt 和相应的标志是芬兰的 The Qt Company Ltd. 以及/或世界其他国家的商标。所有其他商标属于它们各自的所有者。