从指向基础对象的指针初始化派生对象

时间:2013-10-23 10:17:02

标签: c++ qt casting

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

我想以下列方式扩展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

的构造函数的更改

2 个答案:

答案 0 :(得分:2)

您的问题中不清楚的是您是否是创建套接字对象的人。如果它是使用new NumberedTcpSocket()构建的,那么您可以使用QTcpSocketdynamic_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;