[英]calling default (implicit) copy constructor from the defined 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)
簡而言之 - 沒關系。 您的實施不會(希望)造成任何影響。
如果您閱讀Qt 文檔,它會說如下
QObject 既沒有復制構造函數也沒有賦值運算符。 這是設計使然。 實際上,它們是被聲明的,但是在帶有宏 Q_DISABLE_COPY() 的私有部分中。 事實上,所有從 QObject 派生的 Qt 類(直接或間接)都使用這個宏來聲明它們的復制構造函數和賦值運算符是私有的。
通過這個 - Q_DISABLE_COPY() 。
這要求您使用指針來完成工作。 看看這個討論如何在 Qt 中復制對象的線程。
實際上給定的代碼在 Visual Studio 2013 上編譯沒有錯誤。但是,如果信號的簽名更改為void completed(CustomData data);
然后發生類似的錯誤。 由於您尚未指定編譯器,但我認為它是 gcc/clang,您可能會收到錯誤,因為模板處理略有不同。 如果是這樣,錯誤很可能是由Q_DECLARE_METATYPE(CustomData)
引起的,因為它試圖在內部生成復制構造函數。 將其更改為Q_DECLARE_METATYPE(CustomData*)
(因為這是您真正需要的,您正在排隊CustomData*
CustomData
參數而不是CustomData
,至少在給定的示例中)並且如果您確實沒有按值發送CustomData
實例的信號應該沒事。
此外,如果您通過指針傳遞對象,那么您應該使用Q_DECLARE_METATYPE(CustomData*)
。 但我建議通過std::unique_ptr
或std::shared_ptr
傳遞它以防止內存泄漏。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.