2016-03-16 47 views
0

假设我有这样的自定义类以上使用默认生成的拷贝构造函数Q_DECLARE_METATYPE

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与默认生成的拷贝构造函数一起使用。

回答

0

从技术文档:

的QObject既没有拷贝构造函数也不是赋值运算符。 这是设计。实际上,它们是声明的,但在私有 部分中使用了宏Q_DISABLE_COPY()。实际上,从QObject(直接或间接)派生​​的所有Qt类 都使用此宏来声明 其复制构造函数和赋值运算符是私有的。 推理可以在Qt 对象模型页面上的Identity与Value的讨论中找到。

所以你不能复制从QObject派生的QObject和类。如果您想使用QObject的信号和插槽机制,请改用指针。

+0

但是,如果我添加一个拷贝构造函数并通过信号在栈上传递一个对象(不是ptr),那么插槽会收到一个副本,我是正确的吗? –

+0

只要注意Analytis是结构,而不是类。如果您将Google Analytics定义为类,则会出现复制构造函数为私有的错误。 QObject不支持通过设计进行复制,不要这样做。你也不需要为从QObject派生的类使用Q_DECLARE_METATYPE。你为什么想要做'Q_DECLARE_METATYPE(Analytics)'? –