将默认生成的复制构造函数与Q_DECLARE_METATYPE一起使用

Using default generated copy constructor with Q_DECLARE_METATYPE

本文关键字:DECLARE METATYPE 一起 默认 构造函数 复制      更新时间:2023-10-16

假设我有这个自定义类

struct Analytics : public QObject
{
  Q_OBJECT
  public:
  int a  = 12;
  Analytics(const Analytics& a) {
  }
  Analytics(){
  }
};
Q_DECLARE_METATYPE(Analytics)

以上工作正常。但是我必须提供自己的复制构造函数。我使用默认生成的复制构建器尝试了此操作,但是出现错误

结构分析:公共QObject { Q_OBJECT

  public:
  int a  = 12;
  Analytics(const Analytics& a) = default;
  Analytics(){
  }
};
Q_DECLARE_METATYPE(Analytics)

这是我得到的错误

  5: error: call to implicitly-deleted copy constructor of 'Analytics'
                return new (where) T(*static_cast<const T*>(t));

是否可以将Q_DECLARE_METATYPE与默认生成的复制构造函数一起使用。

来自文档:

QObject既没有复制构造函数,也没有赋值运算符。 这是设计使然。实际上,它们是声明的,但是在私人中 部分包含宏 Q_DISABLE_COPY()。事实上,所有Qt类 派生自 QObject(直接或间接) 使用此宏声明 它们的复制构造函数和赋值运算符是私有的。这 推理可以在Qt上关于身份与价值的讨论中找到 "对象模型"页。

因此,您无法复制 QObject 和从 QObject 派生的类。如果要将信号和插槽机制与 QObjects 一起使用,请改用指针。