2016-12-25 99 views
1

在Qt,試圖分配一個參考,當我收到use of deleted function錯誤:如何在Qt for QObject中通過引用進行賦值?

/home/niko/QT_snippets/QML1/users.cpp:16: error: use of deleted function 'User::User(const User&)' 
    User user=users_map.value("[email protected]"); 
               ^
     ^
/home/niko/QT_snippets/QML1/users.h:7: In file included from ../QML1/users.h:7:0, 
/home/niko/QT_snippets/QML1/users.cpp:1: from ../QML1/users.cpp:1: 
/home/niko/QT_snippets/QML1/user.h:6: 'User::User(const User&)' is implicitly deleted because the default definition would be ill-formed: 
class User : public QObject 
    ^
/opt/Qt/5.7/gcc_64/include/QtCore/QObject:1: In file included from /opt/Qt/5.7/gcc_64/include/QtCore/QObject:1:0, 
/home/niko/QT_snippets/QML1/users.h:4: from ../QML1/users.h:4, 
/home/niko/QT_snippets/QML1/users.cpp:1: from ../QML1/users.cpp:1: 

在C,我總是採用指針,我從來沒有任何問題,但正如我在C見++每個人都使用引用。

我應該如何在Qt中引用對象?例如,在這一行中,我應該如何使user對象成爲users_map對象中的值的引用?

User user=users_map.value("[email protected]"); 

或者可能是以下內容?

User user=&users_map.value("[email protected]"); 

因爲...上面的代碼不能編譯。我需要在Users類的方法內使用它來訪問users_map變量中的數據。

class Users : public QAbstractItemModel 
{ 
    Q_OBJECT 
    enum UserRoles { 
     EmailRole = Qt::UserRole + 1, 
     NameRole, 
     PasswordRole 
    }; 
private: 
    QMap<QString,User>   users_map; 
public: 
    explicit Users(QAbstractItemModel *parent = 0); 
    Q_INVOKABLE QModelIndex index(int row, int column,const QModelIndex &parent = QModelIndex()) const; 
    Q_INVOKABLE QModelIndex parent(const QModelIndex &child) const; 
    Q_INVOKABLE int rowCount(const QModelIndex &parent = QModelIndex()) const; 
    Q_INVOKABLE int columnCount(const QModelIndex &parent = QModelIndex()) const; 
    Q_INVOKABLE QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const; 
    QHash<int, QByteArray> roleNames() const; 
signals: 

public slots: 
}; 

User類聲明如下:

Users類被聲明

class User : public QObject 
{ 
    Q_OBJECT 
    Q_PROPERTY(QString email READ get_email WRITE set_email NOTIFY emailChanged); 
    Q_PROPERTY(QString name READ get_name WRITE set_name NOTIFY nameChanged); 
    Q_PROPERTY(QString password READ get_password WRITE set_password NOTIFY passwordChanged); 
private: 
    QString    email; 
    QString    name; 
    QString    password; 
public: 
    explicit User(QObject *parent = 0); 
    QString get_email(); 
    void set_email(QString data); 
    QString get_name(); 
    void set_name(QString data); 
    QString get_password(); 
    void set_password(QString data); 

signals: 
    void emailChanged(); 
    void nameChanged(); 
    void passwordChanged(); 

public slots: 
}; 
+0

'用戶和用戶= users_map.value( 「[email protected]」);' –

+0

*「試圖分配時一個參考「* - 你從來沒有嘗試過分配參考。而且你用QT對象和你用任何其他對象做同樣的事情。在嘗試使用像QT這樣的高級庫之前,我建議使用C++初學者的書。 –

+0

@IgorTandetnik沒有實現'QMap :: value'返回一個引用,所以你的代碼仍然是錯誤的 – wasthishelpful

回答

3

as I see in C++ everybody uses references.

你不應該相信你所看到的:)


QObject有一個刪除的拷貝構造函數,所以實際上你的派生類User也有一個刪除的拷貝構造函數,並且不能被複制。這是這個錯誤的含義是:

use of deleted function 'User::User(const User&)' 

在下面一行:

User user=&users_map.value("[email protected]"); 

&採取的users_map.value("[email protected]")地址,所以你基本上是建立User*型(懸掛)指針元素通過QMap::value副本返回。

你可以改變你這樣的代碼來獲得一個參考:

User& user=users_map["[email protected]"]; 

注意,沒有QMap::value實現返回一個參考,所以你必須在這裏使用QMap::operator[](你可能要檢查是否"[email protected]"確實一張包含在地圖中的密鑰;否則將被無聲添加)。

但是要知道,QObject(和派生類)被設計爲與指針使用,所以你的宣言:

QMap<QString, User> users_map; 

看起來像在Qt的角度來看,不好的設計,你可能會遇到更多的錯誤這個類型。


順便說一句正確的拼寫是Qt中,不QT其代表的QuickTime)

+0

感謝您的非常有用的評論!它在我添加'&'時編譯了這行代碼,但是後來它又拋出了另一個編譯錯誤,指出'const T QMap :: operator []'所需的'const T QMap '的實例化會導致'錯誤:使用已刪除的函數'User :: User(const User&)'。但無論如何,我會改變一切以指向QObject。我認爲爲了將對象從C++傳遞到QML,我需要通過引用而不是通過指針來完成。所以,如果你說指針更好,我只需切換到指針並忘記引用。再次感謝! – Nulik

相關問題