从定义的复制构造函数中调用默认(隐式)复制构造函数

时间:2016-03-10 12:43:20

标签: c++ qt c++11 constructor copy-constructor

我已经阅读了很多有关此问题的帖子,但我找不到这个答案

在我的Qt应用程序中,我使用QSignalSpy来捕获信号。它为其中一个参数提供了用户定义的数据类型。要捕获这样的参数,我必须首先使用QMetaType和使用宏Q_DECLARE_METATYPE向Qt注册该数据类型。它说

  

只要它提供了一个公共默认构造函数,一个公共复制构造函数和一个公共析构函数,这个宏就会使QMetaType知道类型Type。需要在QVariant中使用Type类型作为自定义类型。

问题:我有一个CustomData类,只定义了构造函数。现在,除非我显式声明析构函数和复制构造函数,否则Qt会抛出错误。我想使用C ++提供的隐式析构函数和复制构造函数。对于析构函数,我使用了

~CustomData() = default;

使用默认的析构函数。但我不能对复制构造函数使用类似的语句。将使用

CustomData( const CustomData& ) {};

调用隐式复制构造函数?

(我这样做是因为我想保留隐式复制构造函数的行为) 提前谢谢。

CustomData类如下所示

#include <QMetaType>
#include <QString>

class CustomData : public QObject
{
Q_OBJECT

public:
  CustomData(QObject *parent = NULL);
  ~CustomData() = default; // I added this line
  //Will the next line call the implicit copy constructor?
  CustomData(const CustomData&) {}; //I added this line


  enum CustomMode {mode1, mode2, mode3};

  void somePublicMethod();

signals:
  void completed(CustomData *data);

private slots:
  void customComplete();

private:
  CustomMode _mode;
  QString _path;

  CustomData *_chained;
};

Q_DECLARE_METATYPE(CustomData)

2 个答案:

答案 0 :(得分:1)

总之 - 没关系。您的实施不会(希望)导致任何影响。

如果您浏览Qt documentation,则说明如下

  

QObject既没有复制构造函数也没有赋值运算符。这是设计的。实际上,它们是声明的,但是在具有宏Q_DISABLE_COPY()的私有部分中。实际上,从QObject(直接或间接)派生​​的所有Qt类都使用此宏来声明其复制构造函数和赋值运算符是私有的。

完成此操作 - Q_DISABLE_COPY()

这表明你使用指针来完成工作。请看这个讨论如何在Qt中复制对象的thread

答案 1 :(得分:1)

实际上,给定代码在Visual Studio 2013上编译时没有错误。但是,如果信号的签名更改为void completed(CustomData data);,则会发生类似的错误。由于您尚未指定编译器,但我认为它是gcc / clang,您可能会收到错误,因为模板处理有所不同。如果是这样,那么错误很可能是由Q_DECLARE_METATYPE(CustomData)引起的,因为它试图在里面生成复制构造函数。将其更改为Q_DECLARE_METATYPE(CustomData*)(因为这是您真正需要的,您排队CustomData*而不是CustomData的参数,至少在给定的示例中)如果您确实没有信号按值发送CustomData个实例,您应该没问题。

此外,如果您通过指针传递对象,则应使用Q_DECLARE_METATYPE(CustomData*)。但我建议将其传递给std::unique_ptrstd::shared_ptr以防止内存泄漏。