1

我将通过一个例子更好地形成问题。

我想扩展Qtcpsocket以下方式的默认实现:

class NumberedTcpSocket : public QTcpSocket
{
Q_OBJECT
public:
    NumberedTcpSocket(QObject *parent=0);
    int number;
};

我在这里唯一要做的就是在int numberQTcpSocket 的默认实现中添加一个字段。我需要这个来枚举打开的套接字。

但是,其余的网络类使用或返回一个Qtcpsocket. 我所做的改变很小并不重要。

我想做这样的事情:

NumberedTcpSocket *clientConnection = returnsPointerToQTcpSocket();
clientConnection->number = predefined_number;

在这种情况下需要进行什么样的铸造?它是否包括对构造函数的更改NumberedTcpSocket

4

2 回答 2

2

您的问题不清楚的是您是否是创建套接字对象的人。如果它是用 构造的new NumberedTcpSocket(),那么你可以从QTcpSocketusing 进行转换dynamic_cast。如果不是,那么它不是一个NumberedTcpSocket,也不可能将其视为一个。

如果您需要做的只是将数字与套​​接字相关联,另一种方法是避免创建子类并使用QObject动态属性系统。也就是说,您可以使用 设置数字clientConnection->setProperty("number", predefined_number);,并使用 检索它clientConnection->property("number").toInt();。但是如果没有更多关于你想要达到的目标的细节,很难给出建议。

于 2013-10-23T13:04:31.747 回答
1

让我回顾一下以确保我理解:您想向自己创建的套接字添加一些东西吗?或者您想在 Qt 创建的套接字中添加一些东西?后者是不可能的(Qt 只保留了 QTcpSocket 所需的空间,它将在哪里存储您的附加号码)?

在前一种情况下,您需要一个动态演员表。还要确保检查结果是否为 != 0,以查看转换是否成功:

NumberedTcpSocket *clientConnection = dynamic_cast<NumberedTcpSocket*>
    (returnsPointerToQTcpSocket());
if (clientConnection)
{
    clientConnection->number = predefined_number;
}

但问题是为什么你没有从一开始就创建具有适当数量的套接字。

在这两种情况下,一个更强大的解决方案可能是有一个地图,您可以在其中为每个套接字存储您需要的这个数字:

QMap<QtcpSocket*, int> m_socketNumbers;
于 2013-10-23T10:26:03.200 回答