2016-03-16 94 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)'? –