我有自定义类,它来自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);
如何正确添加列表中的对象?
答案 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
想要它。