无法在QList中添加我的类

时间:2015-12-25 10:07:44

标签: c++ qt c++11 qlist

我有自定义类,它来自QObject:

class Client : public QObject
{
    Q_OBJECT
    friend class Server;
public:
    Client(QTcpSocket *socket, QObject *parent = 0);
private:
    QTcpSocket *mSocket;
};

并尝试将其添加到我的列表(QList)

auto socket = mServer->nextPendingConnection();
Client client(socket);
mClients.append(client);

它输出下一个:

  

/usr/include/x86_64-linux-gnu/qt5/QtCore/qlist.h:521:从   ' void QList :: append(const T&)[with T = Client]'   
...   
/usr/include/x86_64-linux-gnu/qt5/QtCore/qlist.h:372:错误:使用   已删除的功能'客户端::客户端(const客户端&)'        if(QTypeInfo :: isLarge || QTypeInfo :: isStatic)n-> v = new T(t);

如何正确添加列表中的对象?

3 个答案:

答案 0 :(得分:5)

QObject具有私有拷贝构造函数和赋值运算符。您应该存储智能指针列表,而不是对象。

您不应该为类定义复制构造函数,该构造函数派生自QObject

  

不应将QObject的子类实例视为值   可以复制或分配,但作为唯一身份。这意味着   当你创建自己的QObject子类(导演或者   间接),你不应该给它一个复制构造函数或赋值   操作

     

没有复制构造函数或赋值运算符

     

QObject既没有复制构造函数也没有赋值运算符。   这是设计的。实际上,他们被宣布,但在私人   带有宏Q_DISABLE_COPY()的部分。实际上,所有的Qt类   派生自QObject(直接或间接)使用此宏来声明   他们的拷贝构造函数和赋值运算符是私有的。

答案 1 :(得分:1)

不要使用基于QObject的类的复制。使用指针:

QList<Client*> mClients;
Client* cln = new Client( socket );
mClients << cln;
....

或者您可以使用智能指针

答案 2 :(得分:0)

我想您应该为copy constructor类定义Client,因为valid reason而被删除,看起来QList想要它。