簡體   English   中英

從定義的復制構造函數調用默認(隱式)復制構造函數

[英]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_ptrstd::shared_ptr傳遞它以防止內存泄漏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM