我将通过一个例子更好地形成问题。
我想以下列方式扩展Qtcpsocket
的defult实现:
class NumberedTcpSocket : public QTcpSocket
{
Q_OBJECT
public:
NumberedTcpSocket(QObject *parent=0);
int number;
};
我在这里唯一要做的就是在QTcpSocket的默认实现中添加int number
字段。我需要这个来枚举打开的套接字。
但是,其余网络类使用或返回Qtcpsocket
。我所做的改变很小并不重要。
我想做这样的事情:
NumberedTcpSocket *clientConnection = returnsPointerToQTcpSocket();
clientConnection->number = predefined_number;
在这种情况下需要做什么样的铸造?它是否包含NumberedTcpSocket
答案 0 :(得分:2)
您的问题中不清楚的是您是否是创建套接字对象的人。如果它是使用new NumberedTcpSocket()
构建的,那么您可以使用QTcpSocket
从dynamic_cast
投射。如果不是,那么,它不是NumberedTcpSocket
,也不可能将其视为一个。
另一种方法是,如果您只需将数字与套接字关联,则应避免创建子类并使用QObject
动态属性系统。也就是说,您可以使用clientConnection->setProperty("number", predefined_number);
设置数字,并使用clientConnection->property("number").toInt();
进行检索。但是如果没有更多关于你想要达到的目标的详细信息,就很难建议。
答案 1 :(得分:1)
让我回顾一下,确保我理解:你想在你自己创建的套接字上添加一些内容吗?或者你想在Qt创建的套接字中添加一些东西?后者是不可能的(Qt只保留QTcpSocket所需的空间,它会在哪里存储你的额外数字)?
在前一种情况下,您需要动态演员表。还要确保检查结果是否为!= 0,以查看演员表是否成功:
NumberedTcpSocket *clientConnection = dynamic_cast<NumberedTcpSocket*>
(returnsPointerToQTcpSocket());
if (clientConnection)
{
clientConnection->number = predefined_number;
}
但问题是为什么你从一开始就没有用适当的号码创建套接字。
在这两种情况下,一个更强大的解决方案可能是拥有一个地图,您可以为每个插槽存储您需要的这个数字:
QMap<QtcpSocket*, int> m_socketNumbers;